@@ -763,6 +763,10 @@ Error LTO::add(std::unique_ptr<InputFile> Input,
763763 return Error::success ();
764764}
765765
766+ void LTO::setBitcodeLibFuncs (const SmallVector<StringRef> &BitcodeLibFuncs) {
767+ this ->BitcodeLibFuncs = BitcodeLibFuncs;
768+ }
769+
766770Expected<ArrayRef<SymbolResolution>>
767771LTO::addModule (InputFile &Input, ArrayRef<SymbolResolution> InputRes,
768772 unsigned ModI, ArrayRef<SymbolResolution> Res) {
@@ -1385,9 +1389,9 @@ Error LTO::runRegularLTO(AddStreamFn AddStream) {
13851389 }
13861390
13871391 if (!RegularLTO.EmptyCombinedModule || Conf.AlwaysEmitRegularLTOObj ) {
1388- if (Error Err =
1389- backend ( Conf, AddStream, RegularLTO.ParallelCodeGenParallelismLevel ,
1390- *RegularLTO.CombinedModule , ThinLTO.CombinedIndex ))
1392+ if (Error Err = backend (
1393+ Conf, AddStream, RegularLTO.ParallelCodeGenParallelismLevel ,
1394+ *RegularLTO.CombinedModule , ThinLTO.CombinedIndex , BitcodeLibFuncs ))
13911395 return Err;
13921396 }
13931397
@@ -1407,6 +1411,21 @@ SmallVector<const char *> LTO::getRuntimeLibcallSymbols(const Triple &TT) {
14071411 return LibcallSymbols;
14081412}
14091413
1414+ SmallVector<StringRef> LTO::getLibFuncSymbols (const Triple &TT,
1415+ StringSaver &Saver) {
1416+ auto TLII = std::make_unique<TargetLibraryInfoImpl>(TT);
1417+ TargetLibraryInfo TLI (*TLII);
1418+ SmallVector<StringRef> LibFuncSymbols;
1419+ LibFuncSymbols.reserve (LibFunc::NumLibFuncs);
1420+ for (unsigned I = 0 , E = static_cast <unsigned >(LibFunc::NumLibFuncs); I != E;
1421+ ++I) {
1422+ LibFunc F = static_cast <LibFunc>(I);
1423+ if (TLI.has (F))
1424+ LibFuncSymbols.push_back (Saver.save (TLI.getName (F)).data ());
1425+ }
1426+ return LibFuncSymbols;
1427+ }
1428+
14101429Error ThinBackendProc::emitFiles (
14111430 const FunctionImporter::ImportMapTy &ImportList, llvm::StringRef ModulePath,
14121431 const std::string &NewModulePath) const {
@@ -1484,18 +1503,20 @@ class CGThinBackend : public ThinBackendProc {
14841503class InProcessThinBackend : public CGThinBackend {
14851504protected:
14861505 FileCache Cache;
1506+ const SmallVector<StringRef> &BitcodeLibFuncs;
14871507
14881508public:
14891509 InProcessThinBackend (
14901510 const Config &Conf, ModuleSummaryIndex &CombinedIndex,
14911511 ThreadPoolStrategy ThinLTOParallelism,
14921512 const DenseMap<StringRef, GVSummaryMapTy> &ModuleToDefinedGVSummaries,
14931513 AddStreamFn AddStream, FileCache Cache, lto::IndexWriteCallback OnWrite,
1494- bool ShouldEmitIndexFiles, bool ShouldEmitImportsFiles)
1514+ bool ShouldEmitIndexFiles, bool ShouldEmitImportsFiles,
1515+ const SmallVector<StringRef> &BitcodeLibFuncs)
14951516 : CGThinBackend(Conf, CombinedIndex, ModuleToDefinedGVSummaries,
14961517 AddStream, OnWrite, ShouldEmitIndexFiles,
14971518 ShouldEmitImportsFiles, ThinLTOParallelism),
1498- Cache (std::move(Cache)) {}
1519+ Cache (std::move(Cache)), BitcodeLibFuncs(BitcodeLibFuncs) {}
14991520
15001521 virtual Error runThinLTOBackendThread (
15011522 AddStreamFn AddStream, FileCache Cache, unsigned Task, BitcodeModule BM,
@@ -1516,7 +1537,7 @@ class InProcessThinBackend : public CGThinBackend {
15161537
15171538 return thinBackend (Conf, Task, AddStream, **MOrErr, CombinedIndex,
15181539 ImportList, DefinedGlobals, &ModuleMap,
1519- Conf.CodeGenOnly );
1540+ Conf.CodeGenOnly , BitcodeLibFuncs );
15201541 };
15211542 if (ShouldEmitIndexFiles) {
15221543 if (auto E = emitFiles (ImportList, ModuleID, ModuleID.str ()))
@@ -1601,13 +1622,14 @@ class FirstRoundThinBackend : public InProcessThinBackend {
16011622 const Config &Conf, ModuleSummaryIndex &CombinedIndex,
16021623 ThreadPoolStrategy ThinLTOParallelism,
16031624 const DenseMap<StringRef, GVSummaryMapTy> &ModuleToDefinedGVSummaries,
1604- AddStreamFn CGAddStream, FileCache CGCache, AddStreamFn IRAddStream,
1625+ AddStreamFn CGAddStream, FileCache CGCache,
1626+ const SmallVector<StringRef> &BitcodeLibFuncs, AddStreamFn IRAddStream,
16051627 FileCache IRCache)
16061628 : InProcessThinBackend(Conf, CombinedIndex, ThinLTOParallelism,
16071629 ModuleToDefinedGVSummaries, std::move(CGAddStream),
16081630 std::move (CGCache), /* OnWrite=*/ nullptr,
16091631 /* ShouldEmitIndexFiles=*/ false,
1610- /* ShouldEmitImportsFiles=*/ false),
1632+ /* ShouldEmitImportsFiles=*/ false, BitcodeLibFuncs ),
16111633 IRAddStream(std::move(IRAddStream)), IRCache(std::move(IRCache)) {}
16121634
16131635 Error runThinLTOBackendThread (
@@ -1630,7 +1652,7 @@ class FirstRoundThinBackend : public InProcessThinBackend {
16301652
16311653 return thinBackend (Conf, Task, CGAddStream, **MOrErr, CombinedIndex,
16321654 ImportList, DefinedGlobals, &ModuleMap,
1633- Conf.CodeGenOnly , IRAddStream);
1655+ Conf.CodeGenOnly , BitcodeLibFuncs, IRAddStream);
16341656 };
16351657 // Like InProcessThinBackend, we produce index files as needed for
16361658 // FirstRoundThinBackend. However, these files are not generated for
@@ -1697,14 +1719,15 @@ class SecondRoundThinBackend : public InProcessThinBackend {
16971719 ThreadPoolStrategy ThinLTOParallelism,
16981720 const DenseMap<StringRef, GVSummaryMapTy> &ModuleToDefinedGVSummaries,
16991721 AddStreamFn AddStream, FileCache Cache,
1722+ const SmallVector<StringRef> &BitcodeLibFuncs,
17001723 std::unique_ptr<SmallVector<StringRef>> IRFiles,
17011724 stable_hash CombinedCGDataHash)
17021725 : InProcessThinBackend(Conf, CombinedIndex, ThinLTOParallelism,
17031726 ModuleToDefinedGVSummaries, std::move(AddStream),
17041727 std::move (Cache),
17051728 /* OnWrite=*/ nullptr,
17061729 /* ShouldEmitIndexFiles=*/ false,
1707- /* ShouldEmitImportsFiles=*/ false),
1730+ /* ShouldEmitImportsFiles=*/ false, BitcodeLibFuncs ),
17081731 IRFiles(std::move(IRFiles)), CombinedCGDataHash(CombinedCGDataHash) {}
17091732
17101733 Error runThinLTOBackendThread (
@@ -1725,7 +1748,7 @@ class SecondRoundThinBackend : public InProcessThinBackend {
17251748
17261749 return thinBackend (Conf, Task, AddStream, *LoadedModule, CombinedIndex,
17271750 ImportList, DefinedGlobals, &ModuleMap,
1728- /* CodeGenOnly=*/ true );
1751+ /* CodeGenOnly=*/ true , BitcodeLibFuncs );
17291752 };
17301753 if (!Cache.isValid () || !CombinedIndex.modulePaths ().count (ModuleID) ||
17311754 all_of (CombinedIndex.getModuleHash (ModuleID),
@@ -1764,11 +1787,12 @@ ThinBackend lto::createInProcessThinBackend(ThreadPoolStrategy Parallelism,
17641787 auto Func =
17651788 [=](const Config &Conf, ModuleSummaryIndex &CombinedIndex,
17661789 const DenseMap<StringRef, GVSummaryMapTy> &ModuleToDefinedGVSummaries,
1767- AddStreamFn AddStream, FileCache Cache) {
1790+ AddStreamFn AddStream, FileCache Cache,
1791+ const SmallVector<StringRef> &BitcodeLibFuncs) {
17681792 return std::make_unique<InProcessThinBackend>(
17691793 Conf, CombinedIndex, Parallelism, ModuleToDefinedGVSummaries,
17701794 AddStream, Cache, OnWrite, ShouldEmitIndexFiles,
1771- ShouldEmitImportsFiles);
1795+ ShouldEmitImportsFiles, BitcodeLibFuncs );
17721796 };
17731797 return ThinBackend (Func, Parallelism);
17741798}
@@ -1885,7 +1909,8 @@ ThinBackend lto::createWriteIndexesThinBackend(
18851909 auto Func =
18861910 [=](const Config &Conf, ModuleSummaryIndex &CombinedIndex,
18871911 const DenseMap<StringRef, GVSummaryMapTy> &ModuleToDefinedGVSummaries,
1888- AddStreamFn AddStream, FileCache Cache) {
1912+ AddStreamFn AddStream, FileCache Cache,
1913+ const SmallVector<StringRef> &BitcodeLibFuncs) {
18891914 return std::make_unique<WriteIndexesThinBackend>(
18901915 Conf, CombinedIndex, Parallelism, ModuleToDefinedGVSummaries,
18911916 OldPrefix, NewPrefix, NativeObjectPrefix, ShouldEmitImportsFiles,
@@ -2103,7 +2128,7 @@ Error LTO::runThinLTO(AddStreamFn AddStream, FileCache Cache,
21032128 if (!CodeGenDataThinLTOTwoRounds) {
21042129 std::unique_ptr<ThinBackendProc> BackendProc =
21052130 ThinLTO.Backend (Conf, ThinLTO.CombinedIndex , ModuleToDefinedGVSummaries,
2106- AddStream, Cache);
2131+ AddStream, Cache, BitcodeLibFuncs );
21072132 return RunBackends (BackendProc.get ());
21082133 }
21092134
@@ -2126,7 +2151,7 @@ Error LTO::runThinLTO(AddStreamFn AddStream, FileCache Cache,
21262151 LLVM_DEBUG (dbgs () << " [TwoRounds] Running the first round of codegen\n " );
21272152 auto FirstRoundLTO = std::make_unique<FirstRoundThinBackend>(
21282153 Conf, ThinLTO.CombinedIndex , Parallelism, ModuleToDefinedGVSummaries,
2129- CG.AddStream , CG.Cache , IR.AddStream , IR.Cache );
2154+ CG.AddStream , CG.Cache , BitcodeLibFuncs, IR.AddStream , IR.Cache );
21302155 if (Error E = RunBackends (FirstRoundLTO.get ()))
21312156 return E;
21322157
@@ -2142,7 +2167,7 @@ Error LTO::runThinLTO(AddStreamFn AddStream, FileCache Cache,
21422167 LLVM_DEBUG (dbgs () << " [TwoRounds] Running the second round of codegen\n " );
21432168 auto SecondRoundLTO = std::make_unique<SecondRoundThinBackend>(
21442169 Conf, ThinLTO.CombinedIndex , Parallelism, ModuleToDefinedGVSummaries,
2145- AddStream, Cache, IR.getResult (), CombinedHash);
2170+ AddStream, Cache, BitcodeLibFuncs, IR.getResult (), CombinedHash);
21462171 return RunBackends (SecondRoundLTO.get ());
21472172}
21482173
@@ -2620,7 +2645,8 @@ ThinBackend lto::createOutOfProcessThinBackend(
26202645 auto Func =
26212646 [=](const Config &Conf, ModuleSummaryIndex &CombinedIndex,
26222647 const DenseMap<StringRef, GVSummaryMapTy> &ModuleToDefinedGVSummaries,
2623- AddStreamFn AddStream, FileCache Cache) {
2648+ AddStreamFn AddStream, FileCache Cache,
2649+ const SmallVector<StringRef> &BitcodeLibFuncs) {
26242650 return std::make_unique<OutOfProcessThinBackend>(
26252651 Conf, CombinedIndex, Parallelism, ModuleToDefinedGVSummaries,
26262652 AddStream, Cache, OnWrite, ShouldEmitIndexFiles,
0 commit comments