blob: 6fe4e1169ad76692c18136fed2c89342a30f6790 [file] [log] [blame]
Rui Ueyama25992482016-03-22 20:52:10 +00001//===- LTO.cpp ------------------------------------------------------------===//
2//
3// The LLVM Linker
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "LTO.h"
11#include "Config.h"
12#include "Error.h"
13#include "InputFiles.h"
14#include "Symbols.h"
15#include "llvm/Analysis/TargetLibraryInfo.h"
16#include "llvm/Analysis/TargetTransformInfo.h"
17#include "llvm/Bitcode/ReaderWriter.h"
Davide Italiano8eca2822016-04-01 00:35:29 +000018#include "llvm/CodeGen/CommandFlags.h"
Davide Italianobc176632016-04-15 22:38:10 +000019#include "llvm/CodeGen/ParallelCG.h"
Rui Ueyama25992482016-03-22 20:52:10 +000020#include "llvm/IR/LegacyPassManager.h"
21#include "llvm/Linker/IRMover.h"
22#include "llvm/Support/StringSaver.h"
23#include "llvm/Support/TargetRegistry.h"
24#include "llvm/Target/TargetMachine.h"
25#include "llvm/Transforms/IPO.h"
Davide Italiano86f2bd52016-03-29 21:46:35 +000026#include "llvm/Transforms/Utils/ModuleUtils.h"
Rui Ueyama25992482016-03-22 20:52:10 +000027#include "llvm/Transforms/IPO/PassManagerBuilder.h"
28
29using namespace llvm;
30using namespace llvm::object;
31using namespace llvm::ELF;
32
33using namespace lld;
34using namespace lld::elf;
35
36// This is for use when debugging LTO.
Davide Italianobc176632016-04-15 22:38:10 +000037static void saveLtoObjectFile(StringRef Buffer, unsigned I, bool Many) {
38 SmallString<128> Filename = Config->OutputFile;
39 if (Many)
40 Filename += utostr(I);
41 Filename += ".lto.o";
Rui Ueyama25992482016-03-22 20:52:10 +000042 std::error_code EC;
Davide Italianobc176632016-04-15 22:38:10 +000043 raw_fd_ostream OS(Filename, EC, sys::fs::OpenFlags::F_None);
Rui Ueyama25992482016-03-22 20:52:10 +000044 check(EC);
45 OS << Buffer;
46}
47
48// This is for use when debugging LTO.
49static void saveBCFile(Module &M, StringRef Suffix) {
50 std::error_code EC;
51 raw_fd_ostream OS(Config->OutputFile.str() + Suffix.str(), EC,
52 sys::fs::OpenFlags::F_None);
53 check(EC);
54 WriteBitcodeToFile(&M, OS, /* ShouldPreserveUseListOrder */ true);
55}
56
57// Run LTO passes.
Rui Ueyama4e62db42016-03-29 19:19:03 +000058// Note that the gold plugin has a similar piece of code, so
59// it is probably better to move this code to a common place.
Rui Ueyama25992482016-03-22 20:52:10 +000060static void runLTOPasses(Module &M, TargetMachine &TM) {
61 legacy::PassManager LtoPasses;
62 LtoPasses.add(createTargetTransformInfoWrapperPass(TM.getTargetIRAnalysis()));
63 PassManagerBuilder PMB;
64 PMB.LibraryInfo = new TargetLibraryInfoImpl(Triple(TM.getTargetTriple()));
65 PMB.Inliner = createFunctionInliningPass();
Davide Italiano842fa532016-04-03 03:39:09 +000066 PMB.VerifyInput = PMB.VerifyOutput = !Config->DisableVerify;
Rui Ueyama25992482016-03-22 20:52:10 +000067 PMB.LoopVectorize = true;
68 PMB.SLPVectorize = true;
Peter Collingbourneed22f9b2016-03-31 21:00:27 +000069 PMB.OptLevel = Config->LtoO;
Rui Ueyama25992482016-03-22 20:52:10 +000070 PMB.populateLTOPassManager(LtoPasses);
71 LtoPasses.run(M);
72
73 if (Config->SaveTemps)
74 saveBCFile(M, ".lto.opt.bc");
75}
76
77void BitcodeCompiler::add(BitcodeFile &F) {
78 std::unique_ptr<IRObjectFile> Obj =
79 check(IRObjectFile::create(F.MB, Context));
80 std::vector<GlobalValue *> Keep;
81 unsigned BodyIndex = 0;
82 ArrayRef<SymbolBody *> Bodies = F.getSymbols();
83
Davide Italiano86f2bd52016-03-29 21:46:35 +000084 Module &M = Obj->getModule();
Davide Italiano493b6832016-04-16 01:33:33 +000085 if (M.getDataLayoutStr().empty())
86 fatal("invalid bitcode file: " + F.getName() + " has no datalayout");
Davide Italiano49fe4ed2016-03-29 23:57:22 +000087
88 // If a symbol appears in @llvm.used, the linker is required
89 // to treat the symbol as there is a reference to the symbol
90 // that it cannot see. Therefore, we can't internalize.
Davide Italiano86f2bd52016-03-29 21:46:35 +000091 SmallPtrSet<GlobalValue *, 8> Used;
92 collectUsedGlobalVariables(M, Used, /* CompilerUsed */ false);
93
Rui Ueyama25992482016-03-22 20:52:10 +000094 for (const BasicSymbolRef &Sym : Obj->symbols()) {
95 GlobalValue *GV = Obj->getSymbolGV(Sym.getRawDataRefImpl());
Peter Collingbourne7cf73ec2016-04-11 16:39:43 +000096 // Ignore module asm symbols.
97 if (!GV)
98 continue;
Rui Ueyama25992482016-03-22 20:52:10 +000099 if (GV->hasAppendingLinkage()) {
100 Keep.push_back(GV);
101 continue;
102 }
Davide Italiano1460e9f2016-03-26 18:33:09 +0000103 if (BitcodeFile::shouldSkip(Sym))
104 continue;
105 SymbolBody *B = Bodies[BodyIndex++];
106 if (!B || &B->repl() != B || !isa<DefinedBitcode>(B))
107 continue;
108 switch (GV->getLinkage()) {
109 default:
110 break;
111 case llvm::GlobalValue::LinkOnceAnyLinkage:
112 GV->setLinkage(GlobalValue::WeakAnyLinkage);
113 break;
114 case llvm::GlobalValue::LinkOnceODRLinkage:
115 GV->setLinkage(GlobalValue::WeakODRLinkage);
116 break;
Davide Italianod4c2a032016-03-22 22:31:34 +0000117 }
Davide Italiano828ac5412016-03-28 15:44:21 +0000118
119 // We collect the set of symbols we want to internalize here
120 // and change the linkage after the IRMover executed, i.e. after
121 // we imported the symbols and satisfied undefined references
122 // to it. We can't just change linkage here because otherwise
123 // the IRMover will just rename the symbol.
124 // Shared libraries need to be handled slightly differently.
125 // For now, let's be conservative and just never internalize
126 // symbols when creating a shared library.
Rafael Espindola8caf33c2016-04-08 18:39:03 +0000127 if (!Config->Shared && !Config->ExportDynamic && !B->isUsedInRegularObj() &&
128 !B->MustBeInDynSym)
Davide Italiano86f2bd52016-03-29 21:46:35 +0000129 if (!Used.count(GV))
130 InternalizedSyms.insert(GV->getName());
Davide Italiano828ac5412016-03-28 15:44:21 +0000131
Davide Italiano1460e9f2016-03-26 18:33:09 +0000132 Keep.push_back(GV);
Rui Ueyama25992482016-03-22 20:52:10 +0000133 }
134
135 Mover.move(Obj->takeModule(), Keep,
136 [](GlobalValue &, IRMover::ValueAdder) {});
137}
138
Davide Italiano828ac5412016-03-28 15:44:21 +0000139static void internalize(GlobalValue &GV) {
140 assert(!GV.hasLocalLinkage() &&
Davide Italiano47c33f02016-03-29 21:48:25 +0000141 "Trying to internalize a symbol with local linkage!");
Davide Italiano828ac5412016-03-28 15:44:21 +0000142 GV.setLinkage(GlobalValue::InternalLinkage);
143}
144
Davide Italianobc176632016-04-15 22:38:10 +0000145std::vector<std::unique_ptr<InputFile>> BitcodeCompiler::runSplitCodegen() {
146 unsigned NumThreads = Config->LtoJobs;
147 OwningData.resize(NumThreads);
148
149 std::list<raw_svector_ostream> OSs;
150 std::vector<raw_pwrite_stream *> OSPtrs;
151 for (SmallString<0> &Obj : OwningData) {
152 OSs.emplace_back(Obj);
153 OSPtrs.push_back(&OSs.back());
154 }
155
156 splitCodeGen(std::move(Combined), OSPtrs, {},
157 [this]() { return getTargetMachine(); });
158
159 std::vector<std::unique_ptr<InputFile>> ObjFiles;
160 for (SmallString<0> &Obj : OwningData)
161 ObjFiles.push_back(createObjectFile(
162 MemoryBufferRef(Obj, "LLD-INTERNAL-combined-lto-object")));
163
164 if (Config->SaveTemps)
165 for (unsigned I = 0; I < NumThreads; ++I)
166 saveLtoObjectFile(OwningData[I], I, NumThreads > 1);
167
168 return ObjFiles;
169}
170
Rui Ueyama25992482016-03-22 20:52:10 +0000171// Merge all the bitcode files we have seen, codegen the result
172// and return the resulting ObjectFile.
Davide Italianobc176632016-04-15 22:38:10 +0000173std::vector<std::unique_ptr<InputFile>> BitcodeCompiler::compile() {
174 TheTriple = Combined->getTargetTriple();
Davide Italiano828ac5412016-03-28 15:44:21 +0000175 for (const auto &Name : InternalizedSyms) {
Davide Italiano15c41b22016-04-11 22:39:51 +0000176 GlobalValue *GV = Combined->getNamedValue(Name.first());
Davide Italiano828ac5412016-03-28 15:44:21 +0000177 assert(GV);
178 internalize(*GV);
179 }
180
Rui Ueyama25992482016-03-22 20:52:10 +0000181 if (Config->SaveTemps)
Davide Italiano15c41b22016-04-11 22:39:51 +0000182 saveBCFile(*Combined, ".lto.bc");
Rui Ueyama25992482016-03-22 20:52:10 +0000183
Rui Ueyama961f2ff2016-03-23 21:19:27 +0000184 std::unique_ptr<TargetMachine> TM(getTargetMachine());
Davide Italiano15c41b22016-04-11 22:39:51 +0000185 runLTOPasses(*Combined, *TM);
Rui Ueyama25992482016-03-22 20:52:10 +0000186
Davide Italianobc176632016-04-15 22:38:10 +0000187 return runSplitCodegen();
Rui Ueyama25992482016-03-22 20:52:10 +0000188}
189
Davide Italianobc176632016-04-15 22:38:10 +0000190std::unique_ptr<TargetMachine> BitcodeCompiler::getTargetMachine() {
Rui Ueyama961f2ff2016-03-23 21:19:27 +0000191 std::string Msg;
Davide Italianobc176632016-04-15 22:38:10 +0000192 const Target *T = TargetRegistry::lookupTarget(TheTriple, Msg);
Rui Ueyama961f2ff2016-03-23 21:19:27 +0000193 if (!T)
194 fatal("target not found: " + Msg);
Davide Italiano8eca2822016-04-01 00:35:29 +0000195 TargetOptions Options = InitTargetOptionsFromCodeGenFlags();
Rui Ueyama961f2ff2016-03-23 21:19:27 +0000196 Reloc::Model R = Config->Pic ? Reloc::PIC_ : Reloc::Static;
Davide Italianobc176632016-04-15 22:38:10 +0000197 return std::unique_ptr<TargetMachine>(
198 T->createTargetMachine(TheTriple, "", "", Options, R));
Rui Ueyama961f2ff2016-03-23 21:19:27 +0000199}