Mercurial > hg > CbC > CbC_llvm
diff lib/IR/AttributeImpl.h @ 148:63bd29f05246
merged
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 14 Aug 2019 19:46:37 +0900 |
parents | c2174574ed3a |
children |
line wrap: on
line diff
--- a/lib/IR/AttributeImpl.h Sun Dec 23 19:23:36 2018 +0900 +++ b/lib/IR/AttributeImpl.h Wed Aug 14 19:46:37 2019 +0900 @@ -1,14 +1,13 @@ //===- AttributeImpl.h - Attribute Internals --------------------*- C++ -*-===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// /// /// \file -/// \brief This file defines various helper methods and classes used by +/// This file defines various helper methods and classes used by /// LLVMContextImpl for creating and managing attributes. /// //===----------------------------------------------------------------------===// @@ -30,10 +29,11 @@ namespace llvm { class LLVMContext; +class Type; //===----------------------------------------------------------------------===// /// \class -/// \brief This class represents a single, uniqued attribute. That attribute +/// This class represents a single, uniqued attribute. That attribute /// could be a single enum, a tuple, or a string. class AttributeImpl : public FoldingSetNode { unsigned char KindID; ///< Holds the AttrEntryKind of the attribute @@ -42,7 +42,8 @@ enum AttrEntryKind { EnumAttrEntry, IntAttrEntry, - StringAttrEntry + StringAttrEntry, + TypeAttrEntry, }; AttributeImpl(AttrEntryKind KindID) : KindID(KindID) {} @@ -57,6 +58,7 @@ bool isEnumAttribute() const { return KindID == EnumAttrEntry; } bool isIntAttribute() const { return KindID == IntAttrEntry; } bool isStringAttribute() const { return KindID == StringAttrEntry; } + bool isTypeAttribute() const { return KindID == TypeAttrEntry; } bool hasAttribute(Attribute::AttrKind A) const; bool hasAttribute(StringRef Kind) const; @@ -67,16 +69,20 @@ StringRef getKindAsString() const; StringRef getValueAsString() const; - /// \brief Used when sorting the attributes. + Type *getValueAsType() const; + + /// Used when sorting the attributes. bool operator<(const AttributeImpl &AI) const; void Profile(FoldingSetNodeID &ID) const { if (isEnumAttribute()) - Profile(ID, getKindAsEnum(), 0); + Profile(ID, getKindAsEnum(), static_cast<uint64_t>(0)); else if (isIntAttribute()) Profile(ID, getKindAsEnum(), getValueAsInt()); + else if (isStringAttribute()) + Profile(ID, getKindAsString(), getValueAsString()); else - Profile(ID, getKindAsString(), getValueAsString()); + Profile(ID, getKindAsEnum(), getValueAsType()); } static void Profile(FoldingSetNodeID &ID, Attribute::AttrKind Kind, @@ -89,11 +95,17 @@ ID.AddString(Kind); if (!Values.empty()) ID.AddString(Values); } + + static void Profile(FoldingSetNodeID &ID, Attribute::AttrKind Kind, + Type *Ty) { + ID.AddInteger(Kind); + ID.AddPointer(Ty); + } }; //===----------------------------------------------------------------------===// /// \class -/// \brief A set of classes that contain the value of the +/// A set of classes that contain the value of the /// attribute object. There are three main categories: enum attribute entries, /// represented by Attribute::AttrKind; alignment attribute entries; and string /// attribute enties, which are for target-dependent attributes. @@ -146,18 +158,30 @@ StringRef getStringValue() const { return Val; } }; +class TypeAttributeImpl : public EnumAttributeImpl { + virtual void anchor(); + + Type *Ty; + +public: + TypeAttributeImpl(Attribute::AttrKind Kind, Type *Ty) + : EnumAttributeImpl(TypeAttrEntry, Kind), Ty(Ty) {} + + Type *getTypeValue() const { return Ty; } +}; + //===----------------------------------------------------------------------===// /// \class -/// \brief This class represents a group of attributes that apply to one +/// This class represents a group of attributes that apply to one /// element: function, return type, or parameter. class AttributeSetNode final : public FoldingSetNode, private TrailingObjects<AttributeSetNode, Attribute> { friend TrailingObjects; + unsigned NumAttrs; ///< Number of attributes in this node. /// Bitset with a bit for each available attribute Attribute::AttrKind. - uint64_t AvailableAttrs; - unsigned NumAttrs; ///< Number of attributes in this node. + uint8_t AvailableAttrs[12] = {}; AttributeSetNode(ArrayRef<Attribute> Attrs); @@ -172,11 +196,11 @@ static AttributeSetNode *get(LLVMContext &C, ArrayRef<Attribute> Attrs); - /// \brief Return the number of attributes this AttributeList contains. + /// Return the number of attributes this AttributeList contains. unsigned getNumAttributes() const { return NumAttrs; } bool hasAttribute(Attribute::AttrKind Kind) const { - return AvailableAttrs & ((uint64_t)1) << Kind; + return AvailableAttrs[Kind / 8] & ((uint64_t)1) << (Kind % 8); } bool hasAttribute(StringRef Kind) const; bool hasAttributes() const { return NumAttrs != 0; } @@ -190,6 +214,7 @@ uint64_t getDereferenceableOrNullBytes() const; std::pair<unsigned, Optional<unsigned>> getAllocSizeArgs() const; std::string getAsString(bool InAttrGrp) const; + Type *getByValType() const; using iterator = const Attribute *; @@ -210,7 +235,7 @@ //===----------------------------------------------------------------------===// /// \class -/// \brief This class represents a set of attributes that apply to the function, +/// This class represents a set of attributes that apply to the function, /// return type, and parameters. class AttributeListImpl final : public FoldingSetNode, @@ -219,10 +244,10 @@ friend TrailingObjects; private: - /// Bitset with a bit for each available attribute Attribute::AttrKind. - uint64_t AvailableFunctionAttrs; LLVMContext &Context; unsigned NumAttrSets; ///< Number of entries in this set. + /// Bitset with a bit for each available attribute Attribute::AttrKind. + uint8_t AvailableFunctionAttrs[12] = {}; // Helper fn for TrailingObjects class. size_t numTrailingObjects(OverloadToken<AttributeSet>) { return NumAttrSets; } @@ -236,13 +261,13 @@ void operator delete(void *p) { ::operator delete(p); } - /// \brief Get the context that created this AttributeListImpl. + /// Get the context that created this AttributeListImpl. LLVMContext &getContext() { return Context; } - /// \brief Return true if the AttributeSet or the FunctionIndex has an + /// Return true if the AttributeSet or the FunctionIndex has an /// enum attribute of the given kind. bool hasFnAttribute(Attribute::AttrKind Kind) const { - return AvailableFunctionAttrs & ((uint64_t)1) << Kind; + return AvailableFunctionAttrs[Kind / 8] & ((uint64_t)1) << (Kind % 8); } using iterator = const AttributeSet *;