diff options
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/IR/Function.cpp | 26 | ||||
| -rw-r--r-- | llvm/lib/IR/Globals.cpp | 42 | ||||
| -rw-r--r-- | llvm/lib/Linker/IRMover.cpp | 18 | 
3 files changed, 53 insertions, 33 deletions
diff --git a/llvm/lib/IR/Function.cpp b/llvm/lib/IR/Function.cpp index 98f7508cde8..16a9e51b830 100644 --- a/llvm/lib/IR/Function.cpp +++ b/llvm/lib/IR/Function.cpp @@ -416,24 +416,20 @@ void Function::clearGC() {  /// Copy all additional attributes (those not needed to create a Function) from  /// the Function Src to this one. -void Function::copyAttributesFrom(const GlobalValue *Src) { +void Function::copyAttributesFrom(const Function *Src) {    GlobalObject::copyAttributesFrom(Src); -  const Function *SrcF = dyn_cast<Function>(Src); -  if (!SrcF) -    return; - -  setCallingConv(SrcF->getCallingConv()); -  setAttributes(SrcF->getAttributes()); -  if (SrcF->hasGC()) -    setGC(SrcF->getGC()); +  setCallingConv(Src->getCallingConv()); +  setAttributes(Src->getAttributes()); +  if (Src->hasGC()) +    setGC(Src->getGC());    else      clearGC(); -  if (SrcF->hasPersonalityFn()) -    setPersonalityFn(SrcF->getPersonalityFn()); -  if (SrcF->hasPrefixData()) -    setPrefixData(SrcF->getPrefixData()); -  if (SrcF->hasPrologueData()) -    setPrologueData(SrcF->getPrologueData()); +  if (Src->hasPersonalityFn()) +    setPersonalityFn(Src->getPersonalityFn()); +  if (Src->hasPrefixData()) +    setPrefixData(Src->getPrefixData()); +  if (Src->hasPrologueData()) +    setPrologueData(Src->getPrologueData());  }  /// Table of string intrinsic names indexed by enum value. diff --git a/llvm/lib/IR/Globals.cpp b/llvm/lib/IR/Globals.cpp index 5fbf51e0089..10ba1a64ad0 100644 --- a/llvm/lib/IR/Globals.cpp +++ b/llvm/lib/IR/Globals.cpp @@ -69,6 +69,30 @@ void GlobalValue::copyAttributesFrom(const GlobalValue *Src) {    setDLLStorageClass(Src->getDLLStorageClass());  } +void GlobalValue::removeFromParent() { +  switch (getValueID()) { +#define HANDLE_GLOBAL_VALUE(NAME)                                              \ +  case Value::NAME##Val:                                                       \ +    return static_cast<NAME *>(this)->removeFromParent(); +#include "llvm/IR/Value.def" +  default: +    break; +  } +  llvm_unreachable("not a global"); +} + +void GlobalValue::eraseFromParent() { +  switch (getValueID()) { +#define HANDLE_GLOBAL_VALUE(NAME)                                              \ +  case Value::NAME##Val:                                                       \ +    return static_cast<NAME *>(this)->eraseFromParent(); +#include "llvm/IR/Value.def" +  default: +    break; +  } +  llvm_unreachable("not a global"); +} +  unsigned GlobalValue::getAlignment() const {    if (auto *GA = dyn_cast<GlobalAlias>(this)) {      // In general we cannot compute this at the IR level, but we try. @@ -93,12 +117,10 @@ void GlobalObject::setAlignment(unsigned Align) {    assert(getAlignment() == Align && "Alignment representation error!");  } -void GlobalObject::copyAttributesFrom(const GlobalValue *Src) { +void GlobalObject::copyAttributesFrom(const GlobalObject *Src) {    GlobalValue::copyAttributesFrom(Src); -  if (const auto *GV = dyn_cast<GlobalObject>(Src)) { -    setAlignment(GV->getAlignment()); -    setSection(GV->getSection()); -  } +  setAlignment(Src->getAlignment()); +  setSection(Src->getSection());  }  std::string GlobalValue::getGlobalIdentifier(StringRef Name, @@ -333,13 +355,11 @@ void GlobalVariable::setInitializer(Constant *InitVal) {  /// Copy all additional attributes (those not needed to create a GlobalVariable)  /// from the GlobalVariable Src to this one. -void GlobalVariable::copyAttributesFrom(const GlobalValue *Src) { +void GlobalVariable::copyAttributesFrom(const GlobalVariable *Src) {    GlobalObject::copyAttributesFrom(Src); -  if (const GlobalVariable *SrcVar = dyn_cast<GlobalVariable>(Src)) { -    setThreadLocalMode(SrcVar->getThreadLocalMode()); -    setExternallyInitialized(SrcVar->isExternallyInitialized()); -    setAttributes(SrcVar->getAttributes()); -  } +  setThreadLocalMode(Src->getThreadLocalMode()); +  setExternallyInitialized(Src->isExternallyInitialized()); +  setAttributes(Src->getAttributes());  }  void GlobalVariable::dropAllReferences() { diff --git a/llvm/lib/Linker/IRMover.cpp b/llvm/lib/Linker/IRMover.cpp index 15a46a2d042..ecef1efda1a 100644 --- a/llvm/lib/Linker/IRMover.cpp +++ b/llvm/lib/Linker/IRMover.cpp @@ -602,6 +602,7 @@ GlobalVariable *IRLinker::copyGlobalVariableProto(const GlobalVariable *SGVar) {                           /*insertbefore*/ nullptr, SGVar->getThreadLocalMode(),                           SGVar->getType()->getAddressSpace());    NewDGV->setAlignment(SGVar->getAlignment()); +  NewDGV->copyAttributesFrom(SGVar);    return NewDGV;  } @@ -610,8 +611,11 @@ GlobalVariable *IRLinker::copyGlobalVariableProto(const GlobalVariable *SGVar) {  Function *IRLinker::copyFunctionProto(const Function *SF) {    // If there is no linkage to be performed or we are linking from the source,    // bring SF over. -  return Function::Create(TypeMap.get(SF->getFunctionType()), -                          GlobalValue::ExternalLinkage, SF->getName(), &DstM); +  auto *F = +      Function::Create(TypeMap.get(SF->getFunctionType()), +                       GlobalValue::ExternalLinkage, SF->getName(), &DstM); +  F->copyAttributesFrom(SF); +  return F;  }  /// Set up prototypes for any aliases that come over from the source module. @@ -619,9 +623,11 @@ GlobalValue *IRLinker::copyGlobalAliasProto(const GlobalAlias *SGA) {    // If there is no linkage to be performed or we're linking from the source,    // bring over SGA.    auto *Ty = TypeMap.get(SGA->getValueType()); -  return GlobalAlias::create(Ty, SGA->getType()->getPointerAddressSpace(), -                             GlobalValue::ExternalLinkage, SGA->getName(), -                             &DstM); +  auto *GA = +      GlobalAlias::create(Ty, SGA->getType()->getPointerAddressSpace(), +                          GlobalValue::ExternalLinkage, SGA->getName(), &DstM); +  GA->copyAttributesFrom(SGA); +  return GA;  }  GlobalValue *IRLinker::copyGlobalValueProto(const GlobalValue *SGV, @@ -648,8 +654,6 @@ GlobalValue *IRLinker::copyGlobalValueProto(const GlobalValue *SGV,    else if (SGV->hasExternalWeakLinkage())      NewGV->setLinkage(GlobalValue::ExternalWeakLinkage); -  NewGV->copyAttributesFrom(SGV); -    if (auto *NewGO = dyn_cast<GlobalObject>(NewGV)) {      // Metadata for global variables and function declarations is copied eagerly.      if (isa<GlobalVariable>(SGV) || SGV->isDeclaration())  | 

