diff options
Diffstat (limited to 'lib/Transforms/Utils/SymbolRewriter.cpp')
| -rw-r--r-- | lib/Transforms/Utils/SymbolRewriter.cpp | 23 | 
1 files changed, 23 insertions, 0 deletions
| diff --git a/lib/Transforms/Utils/SymbolRewriter.cpp b/lib/Transforms/Utils/SymbolRewriter.cpp index b35a662f17b5..d36283ea3ae1 100644 --- a/lib/Transforms/Utils/SymbolRewriter.cpp +++ b/lib/Transforms/Utils/SymbolRewriter.cpp @@ -79,6 +79,19 @@ static cl::list<std::string> RewriteMapFiles("rewrite-map-file",  namespace llvm {  namespace SymbolRewriter { +void rewriteComdat(Module &M, GlobalObject *GO, const std::string &Source, +                   const std::string &Target) { +  if (Comdat *CD = GO->getComdat()) { +    auto &Comdats = M.getComdatSymbolTable(); + +    Comdat *C = M.getOrInsertComdat(Target); +    C->setSelectionKind(CD->getSelectionKind()); +    GO->setComdat(C); + +    Comdats.erase(Comdats.find(Source)); +  } +} +  template <RewriteDescriptor::Type DT, typename ValueType,            ValueType *(llvm::Module::*Get)(StringRef) const>  class ExplicitRewriteDescriptor : public RewriteDescriptor { @@ -102,10 +115,14 @@ template <RewriteDescriptor::Type DT, typename ValueType,  bool ExplicitRewriteDescriptor<DT, ValueType, Get>::performOnModule(Module &M) {    bool Changed = false;    if (ValueType *S = (M.*Get)(Source)) { +    if (GlobalObject *GO = dyn_cast<GlobalObject>(S)) +      rewriteComdat(M, GO, Source, Target); +      if (Value *T = (M.*Get)(Target))        S->setValueName(T->getValueName());      else        S->setName(Target); +      Changed = true;    }    return Changed; @@ -145,6 +162,12 @@ performOnModule(Module &M) {        report_fatal_error("unable to transforn " + C.getName() + " in " +                           M.getModuleIdentifier() + ": " + Error); +    if (C.getName() == Name) +      continue; + +    if (GlobalObject *GO = dyn_cast<GlobalObject>(&C)) +      rewriteComdat(M, GO, C.getName(), Name); +      if (Value *V = (M.*Get)(Name))        C.setValueName(V->getValueName());      else | 
