diff options
Diffstat (limited to 'lib/Transforms/IPO/FunctionImport.cpp')
| -rw-r--r-- | lib/Transforms/IPO/FunctionImport.cpp | 25 | 
1 files changed, 23 insertions, 2 deletions
diff --git a/lib/Transforms/IPO/FunctionImport.cpp b/lib/Transforms/IPO/FunctionImport.cpp index 6d34ab8b0d96..233a36d2bc54 100644 --- a/lib/Transforms/IPO/FunctionImport.cpp +++ b/lib/Transforms/IPO/FunctionImport.cpp @@ -64,6 +64,12 @@ static cl::opt<float> ImportHotMultiplier(      "import-hot-multiplier", cl::init(3.0), cl::Hidden, cl::value_desc("x"),      cl::desc("Multiply the `import-instr-limit` threshold for hot callsites")); +static cl::opt<float> ImportCriticalMultiplier( +    "import-critical-multiplier", cl::init(100.0), cl::Hidden, +    cl::value_desc("x"), +    cl::desc( +        "Multiply the `import-instr-limit` threshold for critical callsites")); +  // FIXME: This multiplier was not really tuned up.  static cl::opt<float> ImportColdMultiplier(      "import-cold-multiplier", cl::init(0), cl::Hidden, cl::value_desc("N"), @@ -207,6 +213,8 @@ static void computeImportForFunction(          return ImportHotMultiplier;        if (Hotness == CalleeInfo::HotnessType::Cold)          return ImportColdMultiplier; +      if (Hotness == CalleeInfo::HotnessType::Critical) +        return ImportCriticalMultiplier;        return 1.0;      }; @@ -537,8 +545,6 @@ void llvm::thinLTOResolveWeakForLinkerModule(    };    auto updateLinkage = [&](GlobalValue &GV) { -    if (!GlobalValue::isWeakForLinker(GV.getLinkage())) -      return;      // See if the global summary analysis computed a new resolved linkage.      const auto &GS = DefinedGlobals.find(GV.getGUID());      if (GS == DefinedGlobals.end()) @@ -546,6 +552,21 @@ void llvm::thinLTOResolveWeakForLinkerModule(      auto NewLinkage = GS->second->linkage();      if (NewLinkage == GV.getLinkage())        return; + +    // Switch the linkage to weakany if asked for, e.g. we do this for +    // linker redefined symbols (via --wrap or --defsym). +    // We record that the visibility should be changed here in `addThinLTO` +    // as we need access to the resolution vectors for each input file in +    // order to find which symbols have been redefined. +    // We may consider reorganizing this code and moving the linkage recording +    // somewhere else, e.g. in thinLTOResolveWeakForLinkerInIndex. +    if (NewLinkage == GlobalValue::WeakAnyLinkage) { +      GV.setLinkage(NewLinkage); +      return; +    } + +    if (!GlobalValue::isWeakForLinker(GV.getLinkage())) +      return;      // Check for a non-prevailing def that has interposable linkage      // (e.g. non-odr weak or linkonce). In that case we can't simply      // convert to available_externally, since it would lose the  | 
