diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2019-02-05 18:38:58 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2019-02-05 18:38:58 +0000 | 
| commit | e79719ce607b6130e41e23dbdc90cc6b4e0401e6 (patch) | |
| tree | 47bb93fafd9582425ebb778ec77002c222f64ed4 /lib/Transforms/Utils/FunctionImportUtils.cpp | |
| parent | 3edec5c15a78e4abba7eb9102fef3891c84ebdfb (diff) | |
Notes
Diffstat (limited to 'lib/Transforms/Utils/FunctionImportUtils.cpp')
| -rw-r--r-- | lib/Transforms/Utils/FunctionImportUtils.cpp | 18 | 
1 files changed, 18 insertions, 0 deletions
| diff --git a/lib/Transforms/Utils/FunctionImportUtils.cpp b/lib/Transforms/Utils/FunctionImportUtils.cpp index a9772e31da50..81d63ee80394 100644 --- a/lib/Transforms/Utils/FunctionImportUtils.cpp +++ b/lib/Transforms/Utils/FunctionImportUtils.cpp @@ -249,6 +249,8 @@ void FunctionImportGlobalProcessing::processGlobalForThinLTO(GlobalValue &GV) {    bool DoPromote = false;    if (GV.hasLocalLinkage() &&        ((DoPromote = shouldPromoteLocalToGlobal(&GV)) || isPerformingImport())) { +    // Save the original name string before we rename GV below. +    auto Name = GV.getName().str();      // Once we change the name or linkage it is difficult to determine      // again whether we should promote since shouldPromoteLocalToGlobal needs      // to locate the summary (based on GUID from name and linkage). Therefore, @@ -257,6 +259,12 @@ void FunctionImportGlobalProcessing::processGlobalForThinLTO(GlobalValue &GV) {      GV.setLinkage(getLinkage(&GV, DoPromote));      if (!GV.hasLocalLinkage())        GV.setVisibility(GlobalValue::HiddenVisibility); + +    // If we are renaming a COMDAT leader, ensure that we record the COMDAT +    // for later renaming as well. This is required for COFF. +    if (const auto *C = GV.getComdat()) +      if (C->getName() == Name) +        RenamedComdats.try_emplace(C, M.getOrInsertComdat(GV.getName()));    } else      GV.setLinkage(getLinkage(&GV, /* DoPromote */ false)); @@ -281,6 +289,16 @@ void FunctionImportGlobalProcessing::processGlobalsForThinLTO() {      processGlobalForThinLTO(SF);    for (GlobalAlias &GA : M.aliases())      processGlobalForThinLTO(GA); + +  // Replace any COMDATS that required renaming (because the COMDAT leader was +  // promoted and renamed). +  if (!RenamedComdats.empty()) +    for (auto &GO : M.global_objects()) +      if (auto *C = GO.getComdat()) { +        auto Replacement = RenamedComdats.find(C); +        if (Replacement != RenamedComdats.end()) +          GO.setComdat(Replacement->second); +      }  }  bool FunctionImportGlobalProcessing::run() { | 
