LCOV - code coverage report
Current view: top level - lib/IR - Globals.cpp (source / functions) Hit Total Coverage
Test: llvm-toolchain.info Lines: 139 152 91.4 %
Date: 2018-10-20 13:21:21 Functions: 40 44 90.9 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : //===-- Globals.cpp - Implement the GlobalValue & GlobalVariable class ----===//
       2             : //
       3             : //                     The LLVM Compiler Infrastructure
       4             : //
       5             : // This file is distributed under the University of Illinois Open Source
       6             : // License. See LICENSE.TXT for details.
       7             : //
       8             : //===----------------------------------------------------------------------===//
       9             : //
      10             : // This file implements the GlobalValue & GlobalVariable classes for the IR
      11             : // library.
      12             : //
      13             : //===----------------------------------------------------------------------===//
      14             : 
      15             : #include "LLVMContextImpl.h"
      16             : #include "llvm/ADT/SmallPtrSet.h"
      17             : #include "llvm/ADT/Triple.h"
      18             : #include "llvm/IR/ConstantRange.h"
      19             : #include "llvm/IR/Constants.h"
      20             : #include "llvm/IR/DerivedTypes.h"
      21             : #include "llvm/IR/GlobalAlias.h"
      22             : #include "llvm/IR/GlobalValue.h"
      23             : #include "llvm/IR/GlobalVariable.h"
      24             : #include "llvm/IR/Module.h"
      25             : #include "llvm/IR/Operator.h"
      26             : #include "llvm/Support/Error.h"
      27             : #include "llvm/Support/ErrorHandling.h"
      28             : using namespace llvm;
      29             : 
      30             : //===----------------------------------------------------------------------===//
      31             : //                            GlobalValue Class
      32             : //===----------------------------------------------------------------------===//
      33             : 
      34             : // GlobalValue should be a Constant, plus a type, a module, some flags, and an
      35             : // intrinsic ID. Add an assert to prevent people from accidentally growing
      36             : // GlobalValue while adding flags.
      37             : static_assert(sizeof(GlobalValue) ==
      38             :                   sizeof(Constant) + 2 * sizeof(void *) + 2 * sizeof(unsigned),
      39             :               "unexpected GlobalValue size growth");
      40             : 
      41             : // GlobalObject adds a comdat.
      42             : static_assert(sizeof(GlobalObject) == sizeof(GlobalValue) + sizeof(void *),
      43             :               "unexpected GlobalObject size growth");
      44             : 
      45       86197 : bool GlobalValue::isMaterializable() const {
      46             :   if (const Function *F = dyn_cast<Function>(this))
      47           0 :     return F->isMaterializable();
      48             :   return false;
      49             : }
      50      834913 : Error GlobalValue::materialize() {
      51      834913 :   return getParent()->materialize(this);
      52             : }
      53             : 
      54             : /// Override destroyConstantImpl to make sure it doesn't get called on
      55             : /// GlobalValue's because they shouldn't be treated like other constants.
      56           0 : void GlobalValue::destroyConstantImpl() {
      57           0 :   llvm_unreachable("You can't GV->destroyConstantImpl()!");
      58             : }
      59             : 
      60           0 : Value *GlobalValue::handleOperandChangeImpl(Value *From, Value *To) {
      61           0 :   llvm_unreachable("Unsupported class for handleOperandChange()!");
      62             : }
      63             : 
      64             : /// copyAttributesFrom - copy all additional attributes (those not needed to
      65             : /// create a GlobalValue) from the GlobalValue Src to this one.
      66        4451 : void GlobalValue::copyAttributesFrom(const GlobalValue *Src) {
      67             :   setVisibility(Src->getVisibility());
      68             :   setUnnamedAddr(Src->getUnnamedAddr());
      69             :   setDLLStorageClass(Src->getDLLStorageClass());
      70             :   setDSOLocal(Src->isDSOLocal());
      71        4451 : }
      72             : 
      73           0 : void GlobalValue::removeFromParent() {
      74           0 :   switch (getValueID()) {
      75             : #define HANDLE_GLOBAL_VALUE(NAME)                                              \
      76             :   case Value::NAME##Val:                                                       \
      77             :     return static_cast<NAME *>(this)->removeFromParent();
      78             : #include "llvm/IR/Value.def"
      79             :   default:
      80             :     break;
      81             :   }
      82           0 :   llvm_unreachable("not a global");
      83             : }
      84             : 
      85        5376 : void GlobalValue::eraseFromParent() {
      86       10752 :   switch (getValueID()) {
      87             : #define HANDLE_GLOBAL_VALUE(NAME)                                              \
      88             :   case Value::NAME##Val:                                                       \
      89             :     return static_cast<NAME *>(this)->eraseFromParent();
      90             : #include "llvm/IR/Value.def"
      91             :   default:
      92             :     break;
      93             :   }
      94           0 :   llvm_unreachable("not a global");
      95             : }
      96             : 
      97     2902963 : unsigned GlobalValue::getAlignment() const {
      98             :   if (auto *GA = dyn_cast<GlobalAlias>(this)) {
      99             :     // In general we cannot compute this at the IR level, but we try.
     100        3113 :     if (const GlobalObject *GO = GA->getBaseObject())
     101        3006 :       return GO->getAlignment();
     102             : 
     103             :     // FIXME: we should also be able to handle:
     104             :     // Alias = Global + Offset
     105             :     // Alias = Absolute
     106             :     return 0;
     107             :   }
     108     2899850 :   return cast<GlobalObject>(this)->getAlignment();
     109             : }
     110             : 
     111     3065816 : unsigned GlobalValue::getAddressSpace() const {
     112             :   PointerType *PtrTy = getType();
     113     3065816 :   return PtrTy->getAddressSpace();
     114             : }
     115             : 
     116     1295490 : void GlobalObject::setAlignment(unsigned Align) {
     117             :   assert((Align & (Align-1)) == 0 && "Alignment is not a power of 2!");
     118             :   assert(Align <= MaximumAlignment &&
     119             :          "Alignment is greater than MaximumAlignment!");
     120     1295490 :   unsigned AlignmentData = Log2_32(Align) + 1;
     121             :   unsigned OldData = getGlobalValueSubClassData();
     122     1295490 :   setGlobalValueSubClassData((OldData & ~AlignmentMask) | AlignmentData);
     123             :   assert(getAlignment() == Align && "Alignment representation error!");
     124     1295490 : }
     125             : 
     126        4337 : void GlobalObject::copyAttributesFrom(const GlobalObject *Src) {
     127        4337 :   GlobalValue::copyAttributesFrom(Src);
     128        4337 :   setAlignment(Src->getAlignment());
     129        4337 :   setSection(Src->getSection());
     130        4337 : }
     131             : 
     132       11805 : std::string GlobalValue::getGlobalIdentifier(StringRef Name,
     133             :                                              GlobalValue::LinkageTypes Linkage,
     134             :                                              StringRef FileName) {
     135             : 
     136             :   // Value names may be prefixed with a binary '1' to indicate
     137             :   // that the backend should not modify the symbols due to any platform
     138             :   // naming convention. Do not include that '1' in the PGO profile name.
     139       23610 :   if (Name[0] == '\1')
     140          54 :     Name = Name.substr(1);
     141             : 
     142             :   std::string NewName = Name;
     143             :   if (llvm::GlobalValue::isLocalLinkage(Linkage)) {
     144             :     // For local symbols, prepend the main file name to distinguish them.
     145             :     // Do not include the full path in the file name since there's no guarantee
     146             :     // that it will stay the same, e.g., if the files are checked out from
     147             :     // version control in different locations.
     148         818 :     if (FileName.empty())
     149           1 :       NewName = NewName.insert(0, "<unknown>:");
     150             :     else
     151        2451 :       NewName = NewName.insert(0, FileName.str() + ":");
     152             :   }
     153       11805 :   return NewName;
     154             : }
     155             : 
     156        7399 : std::string GlobalValue::getGlobalIdentifier() const {
     157             :   return getGlobalIdentifier(getName(), getLinkage(),
     158       14798 :                              getParent()->getSourceFileName());
     159             : }
     160             : 
     161      687918 : StringRef GlobalValue::getSection() const {
     162             :   if (auto *GA = dyn_cast<GlobalAlias>(this)) {
     163             :     // In general we cannot compute this at the IR level, but we try.
     164         135 :     if (const GlobalObject *GO = GA->getBaseObject())
     165             :       return GO->getSection();
     166           0 :     return "";
     167             :   }
     168             :   return cast<GlobalObject>(this)->getSection();
     169             : }
     170             : 
     171     2171428 : const Comdat *GlobalValue::getComdat() const {
     172             :   if (auto *GA = dyn_cast<GlobalAlias>(this)) {
     173             :     // In general we cannot compute this at the IR level, but we try.
     174        5019 :     if (const GlobalObject *GO = GA->getBaseObject())
     175        4981 :       return const_cast<GlobalObject *>(GO)->getComdat();
     176             :     return nullptr;
     177             :   }
     178             :   // ifunc and its resolver are separate things so don't use resolver comdat.
     179     2166409 :   if (isa<GlobalIFunc>(this))
     180             :     return nullptr;
     181     2166401 :   return cast<GlobalObject>(this)->getComdat();
     182             : }
     183             : 
     184       30250 : StringRef GlobalObject::getSectionImpl() const {
     185             :   assert(hasSection());
     186       30250 :   return getContext().pImpl->GlobalObjectSections[this];
     187             : }
     188             : 
     189      352189 : void GlobalObject::setSection(StringRef S) {
     190             :   // Do nothing if we're clearing the section and it is already empty.
     191      352189 :   if (!hasSection() && S.empty())
     192             :     return;
     193             : 
     194             :   // Get or create a stable section name string and put it in the table in the
     195             :   // context.
     196       24698 :   if (!S.empty()) {
     197       24697 :     S = getContext().pImpl->SectionStrings.insert(S).first->first();
     198             :   }
     199       24698 :   getContext().pImpl->GlobalObjectSections[this] = S;
     200             : 
     201             :   // Update the HasSectionHashEntryBit. Setting the section to the empty string
     202             :   // means this global no longer has a section.
     203             :   setGlobalObjectFlag(HasSectionHashEntryBit, !S.empty());
     204             : }
     205             : 
     206    86156628 : bool GlobalValue::isDeclaration() const {
     207             :   // Globals are definitions if they have an initializer.
     208             :   if (const GlobalVariable *GV = dyn_cast<GlobalVariable>(this))
     209    47316041 :     return GV->getNumOperands() == 0;
     210             : 
     211             :   // Functions are definitions if they have a body.
     212             :   if (const Function *F = dyn_cast<Function>(this))
     213    38831131 :     return F->empty() && !F->isMaterializable();
     214             : 
     215             :   // Aliases and ifuncs are always definitions.
     216             :   assert(isa<GlobalIndirectSymbol>(this));
     217             :   return false;
     218             : }
     219             : 
     220       13997 : bool GlobalValue::canIncreaseAlignment() const {
     221             :   // Firstly, can only increase the alignment of a global if it
     222             :   // is a strong definition.
     223       13997 :   if (!isStrongDefinitionForLinker())
     224             :     return false;
     225             : 
     226             :   // It also has to either not have a section defined, or, not have
     227             :   // alignment specified. (If it is assigned a section, the global
     228             :   // could be densely packed with other objects in the section, and
     229             :   // increasing the alignment could cause padding issues.)
     230       13833 :   if (hasSection() && getAlignment() > 0)
     231             :     return false;
     232             : 
     233             :   // On ELF platforms, we're further restricted in that we can't
     234             :   // increase the alignment of any variable which might be emitted
     235             :   // into a shared library, and which is exported. If the main
     236             :   // executable accesses a variable found in a shared-lib, the main
     237             :   // exe actually allocates memory for and exports the symbol ITSELF,
     238             :   // overriding the symbol found in the library. That is, at link
     239             :   // time, the observed alignment of the variable is copied into the
     240             :   // executable binary. (A COPY relocation is also generated, to copy
     241             :   // the initial data from the shadowed variable in the shared-lib
     242             :   // into the location in the main binary, before running code.)
     243             :   //
     244             :   // And thus, even though you might think you are defining the
     245             :   // global, and allocating the memory for the global in your object
     246             :   // file, and thus should be able to set the alignment arbitrarily,
     247             :   // that's not actually true. Doing so can cause an ABI breakage; an
     248             :   // executable might have already been built with the previous
     249             :   // alignment of the variable, and then assuming an increased
     250             :   // alignment will be incorrect.
     251             : 
     252             :   // Conservatively assume ELF if there's no parent pointer.
     253             :   bool isELF =
     254       13815 :       (!Parent || Triple(Parent->getTargetTriple()).isOSBinFormatELF());
     255       13815 :   if (isELF && hasDefaultVisibility() && !hasLocalLinkage())
     256          28 :     return false;
     257             : 
     258             :   return true;
     259             : }
     260             : 
     261       47790 : const GlobalObject *GlobalValue::getBaseObject() const {
     262             :   if (auto *GO = dyn_cast<GlobalObject>(this))
     263             :     return GO;
     264             :   if (auto *GA = dyn_cast<GlobalIndirectSymbol>(this))
     265         690 :     return GA->getBaseObject();
     266             :   return nullptr;
     267             : }
     268             : 
     269     1143060 : bool GlobalValue::isAbsoluteSymbolRef() const {
     270             :   auto *GO = dyn_cast<GlobalObject>(this);
     271             :   if (!GO)
     272             :     return false;
     273             : 
     274     1142942 :   return GO->getMetadata(LLVMContext::MD_absolute_symbol);
     275             : }
     276             : 
     277     2752966 : Optional<ConstantRange> GlobalValue::getAbsoluteSymbolRange() const {
     278             :   auto *GO = dyn_cast<GlobalObject>(this);
     279             :   if (!GO)
     280             :     return None;
     281             : 
     282     2752829 :   MDNode *MD = GO->getMetadata(LLVMContext::MD_absolute_symbol);
     283     2752829 :   if (!MD)
     284             :     return None;
     285             : 
     286          54 :   return getConstantRangeFromMetadata(*MD);
     287             : }
     288             : 
     289       20290 : bool GlobalValue::canBeOmittedFromSymbolTable() const {
     290       20290 :   if (!hasLinkOnceODRLinkage())
     291             :     return false;
     292             : 
     293             :   // We assume that anyone who sets global unnamed_addr on a non-constant
     294             :   // knows what they're doing.
     295        1918 :   if (hasGlobalUnnamedAddr())
     296             :     return true;
     297             : 
     298             :   // If it is a non constant variable, it needs to be uniqued across shared
     299             :   // objects.
     300             :   if (auto *Var = dyn_cast<GlobalVariable>(this))
     301          29 :     if (!Var->isConstant())
     302             :       return false;
     303             : 
     304         548 :   return hasAtLeastLocalUnnamedAddr();
     305             : }
     306             : 
     307             : //===----------------------------------------------------------------------===//
     308             : // GlobalVariable Implementation
     309             : //===----------------------------------------------------------------------===//
     310             : 
     311        1364 : GlobalVariable::GlobalVariable(Type *Ty, bool constant, LinkageTypes Link,
     312             :                                Constant *InitVal, const Twine &Name,
     313             :                                ThreadLocalMode TLMode, unsigned AddressSpace,
     314        1364 :                                bool isExternallyInitialized)
     315             :     : GlobalObject(Ty, Value::GlobalVariableVal,
     316             :                    OperandTraits<GlobalVariable>::op_begin(this),
     317             :                    InitVal != nullptr, Link, Name, AddressSpace),
     318             :       isConstantGlobal(constant),
     319        1364 :       isExternallyInitializedConstant(isExternallyInitialized) {
     320             :   assert(!Ty->isFunctionTy() && PointerType::isValidElementType(Ty) &&
     321             :          "invalid type for global variable");
     322             :   setThreadLocalMode(TLMode);
     323        1364 :   if (InitVal) {
     324             :     assert(InitVal->getType() == Ty &&
     325             :            "Initializer should be the same type as the GlobalVariable!");
     326             :     Op<0>() = InitVal;
     327             :   }
     328        1364 : }
     329             : 
     330      403708 : GlobalVariable::GlobalVariable(Module &M, Type *Ty, bool constant,
     331             :                                LinkageTypes Link, Constant *InitVal,
     332             :                                const Twine &Name, GlobalVariable *Before,
     333             :                                ThreadLocalMode TLMode, unsigned AddressSpace,
     334      403708 :                                bool isExternallyInitialized)
     335             :     : GlobalObject(Ty, Value::GlobalVariableVal,
     336             :                    OperandTraits<GlobalVariable>::op_begin(this),
     337             :                    InitVal != nullptr, Link, Name, AddressSpace),
     338             :       isConstantGlobal(constant),
     339      403708 :       isExternallyInitializedConstant(isExternallyInitialized) {
     340             :   assert(!Ty->isFunctionTy() && PointerType::isValidElementType(Ty) &&
     341             :          "invalid type for global variable");
     342             :   setThreadLocalMode(TLMode);
     343      403708 :   if (InitVal) {
     344             :     assert(InitVal->getType() == Ty &&
     345             :            "Initializer should be the same type as the GlobalVariable!");
     346             :     Op<0>() = InitVal;
     347             :   }
     348             : 
     349      403708 :   if (Before)
     350         340 :     Before->getParent()->getGlobalList().insert(Before->getIterator(), this);
     351             :   else
     352      403368 :     M.getGlobalList().push_back(this);
     353      403708 : }
     354             : 
     355         155 : void GlobalVariable::removeFromParent() {
     356         155 :   getParent()->getGlobalList().remove(getIterator());
     357         155 : }
     358             : 
     359        3163 : void GlobalVariable::eraseFromParent() {
     360        3163 :   getParent()->getGlobalList().erase(getIterator());
     361        3163 : }
     362             : 
     363       84904 : void GlobalVariable::setInitializer(Constant *InitVal) {
     364       84904 :   if (!InitVal) {
     365         157 :     if (hasInitializer()) {
     366             :       // Note, the num operands is used to compute the offset of the operand, so
     367             :       // the order here matters.  Clearing the operand then clearing the num
     368             :       // operands ensures we have the correct offset to the operand.
     369             :       Op<0>().set(nullptr);
     370             :       setGlobalVariableNumOperands(0);
     371             :     }
     372             :   } else {
     373             :     assert(InitVal->getType() == getValueType() &&
     374             :            "Initializer type must match GlobalVariable type");
     375             :     // Note, the num operands is used to compute the offset of the operand, so
     376             :     // the order here matters.  We need to set num operands to 1 first so that
     377             :     // we get the correct offset to the first operand when we set it.
     378       84747 :     if (!hasInitializer())
     379             :       setGlobalVariableNumOperands(1);
     380       84747 :     Op<0>().set(InitVal);
     381             :   }
     382       84904 : }
     383             : 
     384             : /// Copy all additional attributes (those not needed to create a GlobalVariable)
     385             : /// from the GlobalVariable Src to this one.
     386        1068 : void GlobalVariable::copyAttributesFrom(const GlobalVariable *Src) {
     387        1068 :   GlobalObject::copyAttributesFrom(Src);
     388             :   setThreadLocalMode(Src->getThreadLocalMode());
     389             :   setExternallyInitialized(Src->isExternallyInitialized());
     390             :   setAttributes(Src->getAttributes());
     391        1068 : }
     392             : 
     393      260083 : void GlobalVariable::dropAllReferences() {
     394      260083 :   User::dropAllReferences();
     395      260083 :   clearMetadata();
     396      260083 : }
     397             : 
     398             : //===----------------------------------------------------------------------===//
     399             : // GlobalIndirectSymbol Implementation
     400             : //===----------------------------------------------------------------------===//
     401             : 
     402        3246 : GlobalIndirectSymbol::GlobalIndirectSymbol(Type *Ty, ValueTy VTy,
     403             :     unsigned AddressSpace, LinkageTypes Linkage, const Twine &Name,
     404        3246 :     Constant *Symbol)
     405        6492 :     : GlobalValue(Ty, VTy, &Op<0>(), 1, Linkage, Name, AddressSpace) {
     406             :     Op<0>() = Symbol;
     407        3246 : }
     408             : 
     409             : 
     410             : //===----------------------------------------------------------------------===//
     411             : // GlobalAlias Implementation
     412             : //===----------------------------------------------------------------------===//
     413             : 
     414        3112 : GlobalAlias::GlobalAlias(Type *Ty, unsigned AddressSpace, LinkageTypes Link,
     415             :                          const Twine &Name, Constant *Aliasee,
     416        3112 :                          Module *ParentModule)
     417             :     : GlobalIndirectSymbol(Ty, Value::GlobalAliasVal, AddressSpace, Link, Name,
     418        3112 :                            Aliasee) {
     419        3112 :   if (ParentModule)
     420        2137 :     ParentModule->getAliasList().push_back(this);
     421        3112 : }
     422             : 
     423        3112 : GlobalAlias *GlobalAlias::create(Type *Ty, unsigned AddressSpace,
     424             :                                  LinkageTypes Link, const Twine &Name,
     425             :                                  Constant *Aliasee, Module *ParentModule) {
     426        3112 :   return new GlobalAlias(Ty, AddressSpace, Link, Name, Aliasee, ParentModule);
     427             : }
     428             : 
     429         990 : GlobalAlias *GlobalAlias::create(Type *Ty, unsigned AddressSpace,
     430             :                                  LinkageTypes Linkage, const Twine &Name,
     431             :                                  Module *Parent) {
     432         990 :   return create(Ty, AddressSpace, Linkage, Name, nullptr, Parent);
     433             : }
     434             : 
     435         545 : GlobalAlias *GlobalAlias::create(Type *Ty, unsigned AddressSpace,
     436             :                                  LinkageTypes Linkage, const Twine &Name,
     437             :                                  GlobalValue *Aliasee) {
     438         545 :   return create(Ty, AddressSpace, Linkage, Name, Aliasee, Aliasee->getParent());
     439             : }
     440             : 
     441         545 : GlobalAlias *GlobalAlias::create(LinkageTypes Link, const Twine &Name,
     442             :                                  GlobalValue *Aliasee) {
     443             :   PointerType *PTy = Aliasee->getType();
     444         545 :   return create(PTy->getElementType(), PTy->getAddressSpace(), Link, Name,
     445         545 :                 Aliasee);
     446             : }
     447             : 
     448           4 : GlobalAlias *GlobalAlias::create(const Twine &Name, GlobalValue *Aliasee) {
     449           4 :   return create(Aliasee->getLinkage(), Name, Aliasee);
     450             : }
     451             : 
     452           9 : void GlobalAlias::removeFromParent() {
     453           9 :   getParent()->getAliasList().remove(getIterator());
     454           9 : }
     455             : 
     456         120 : void GlobalAlias::eraseFromParent() {
     457         120 :   getParent()->getAliasList().erase(getIterator());
     458         120 : }
     459             : 
     460         122 : void GlobalAlias::setAliasee(Constant *Aliasee) {
     461             :   assert((!Aliasee || Aliasee->getType() == getType()) &&
     462             :          "Alias and aliasee types should match!");
     463             :   setIndirectSymbol(Aliasee);
     464         122 : }
     465             : 
     466             : //===----------------------------------------------------------------------===//
     467             : // GlobalIFunc Implementation
     468             : //===----------------------------------------------------------------------===//
     469             : 
     470         134 : GlobalIFunc::GlobalIFunc(Type *Ty, unsigned AddressSpace, LinkageTypes Link,
     471             :                          const Twine &Name, Constant *Resolver,
     472         134 :                          Module *ParentModule)
     473             :     : GlobalIndirectSymbol(Ty, Value::GlobalIFuncVal, AddressSpace, Link, Name,
     474         134 :                            Resolver) {
     475         134 :   if (ParentModule)
     476          93 :     ParentModule->getIFuncList().push_back(this);
     477         134 : }
     478             : 
     479         134 : GlobalIFunc *GlobalIFunc::create(Type *Ty, unsigned AddressSpace,
     480             :                                  LinkageTypes Link, const Twine &Name,
     481             :                                  Constant *Resolver, Module *ParentModule) {
     482         134 :   return new GlobalIFunc(Ty, AddressSpace, Link, Name, Resolver, ParentModule);
     483             : }
     484             : 
     485           0 : void GlobalIFunc::removeFromParent() {
     486           0 :   getParent()->getIFuncList().remove(getIterator());
     487           0 : }
     488             : 
     489           6 : void GlobalIFunc::eraseFromParent() {
     490           6 :   getParent()->getIFuncList().erase(getIterator());
     491           6 : }

Generated by: LCOV version 1.13