| //===-- llvm/GlobalObject.h - Class to represent global objects -*- C++ -*-===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This represents an independent object. That is, a function or a global |
| // variable, but not an alias. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef LLVM_IR_GLOBALOBJECT_H |
| #define LLVM_IR_GLOBALOBJECT_H |
| |
| #include "llvm/IR/Constant.h" |
| #include "llvm/IR/DerivedTypes.h" |
| #include "llvm/IR/GlobalValue.h" |
| |
| namespace llvm { |
| class Comdat; |
| class Module; |
| |
| class GlobalObject : public GlobalValue { |
| GlobalObject(const GlobalObject &) = delete; |
| |
| protected: |
| GlobalObject(Type *Ty, ValueTy VTy, Use *Ops, unsigned NumOps, |
| LinkageTypes Linkage, const Twine &Name, |
| unsigned AddressSpace = 0) |
| : GlobalValue(Ty, VTy, Ops, NumOps, Linkage, Name, AddressSpace), |
| ObjComdat(nullptr) { |
| setGlobalValueSubClassData(0); |
| } |
| |
| std::string Section; // Section to emit this into, empty means default |
| Comdat *ObjComdat; |
| static const unsigned AlignmentBits = 5; |
| static const unsigned GlobalObjectSubClassDataBits = |
| GlobalValueSubClassDataBits - AlignmentBits; |
| |
| private: |
| static const unsigned AlignmentMask = (1 << AlignmentBits) - 1; |
| |
| public: |
| unsigned getAlignment() const { |
| unsigned Data = getGlobalValueSubClassData(); |
| unsigned AlignmentData = Data & AlignmentMask; |
| return (1u << AlignmentData) >> 1; |
| } |
| void setAlignment(unsigned Align); |
| |
| unsigned getGlobalObjectSubClassData() const; |
| void setGlobalObjectSubClassData(unsigned Val); |
| |
| bool hasSection() const { return !StringRef(getSection()).empty(); } |
| const char *getSection() const { return Section.c_str(); } |
| void setSection(StringRef S); |
| |
| bool hasComdat() const { return getComdat() != nullptr; } |
| const Comdat *getComdat() const { return ObjComdat; } |
| Comdat *getComdat() { return ObjComdat; } |
| void setComdat(Comdat *C) { ObjComdat = C; } |
| |
| void copyAttributesFrom(const GlobalValue *Src) override; |
| |
| // Methods for support type inquiry through isa, cast, and dyn_cast: |
| static inline bool classof(const Value *V) { |
| return V->getValueID() == Value::FunctionVal || |
| V->getValueID() == Value::GlobalVariableVal; |
| } |
| }; |
| |
| } // End llvm namespace |
| |
| #endif |