1 //===-LTOCodeGenerator.cpp - LLVM Link Time Optimizer ---------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file implements the Link Time Optimization library. This library is
11 // intended to be used by linker to optimize code at link time.
13 //===----------------------------------------------------------------------===//
15 #include "LTOModule.h"
16 #include "LTOCodeGenerator.h"
18 #include "llvm/Constants.h"
19 #include "llvm/DerivedTypes.h"
20 #include "llvm/Linker.h"
21 #include "llvm/LLVMContext.h"
22 #include "llvm/Module.h"
23 #include "llvm/PassManager.h"
24 #include "llvm/ADT/StringExtras.h"
25 #include "llvm/ADT/Triple.h"
26 #include "llvm/Analysis/Passes.h"
27 #include "llvm/Bitcode/ReaderWriter.h"
28 #include "llvm/MC/MCAsmInfo.h"
29 #include "llvm/MC/MCContext.h"
30 #include "llvm/Target/Mangler.h"
31 #include "llvm/Target/SubtargetFeature.h"
32 #include "llvm/Target/TargetOptions.h"
33 #include "llvm/Target/TargetData.h"
34 #include "llvm/Target/TargetMachine.h"
35 #include "llvm/Target/TargetRegistry.h"
36 #include "llvm/Target/TargetSelect.h"
37 #include "llvm/Support/CommandLine.h"
38 #include "llvm/Support/FormattedStream.h"
39 #include "llvm/Support/MemoryBuffer.h"
40 #include "llvm/Support/StandardPasses.h"
41 #include "llvm/Support/SystemUtils.h"
42 #include "llvm/Support/ToolOutputFile.h"
43 #include "llvm/Support/Host.h"
44 #include "llvm/Support/Program.h"
45 #include "llvm/Support/Signals.h"
46 #include "llvm/Support/system_error.h"
47 #include "llvm/Config/config.h"
55 static cl::opt
<bool> DisableInline("disable-inlining",
56 cl::desc("Do not run the inliner pass"));
59 const char* LTOCodeGenerator::getVersionString()
61 #ifdef LLVM_VERSION_INFO
62 return PACKAGE_NAME
" version " PACKAGE_VERSION
", " LLVM_VERSION_INFO
;
64 return PACKAGE_NAME
" version " PACKAGE_VERSION
;
69 LTOCodeGenerator::LTOCodeGenerator()
70 : _context(getGlobalContext()),
71 _linker("LinkTimeOptimizer", "ld-temp.o", _context
), _target(NULL
),
72 _emitDwarfDebugInfo(false), _scopeRestrictionsDone(false),
73 _codeModel(LTO_CODEGEN_PIC_MODEL_DYNAMIC
),
74 _nativeObjectFile(NULL
)
76 InitializeAllTargets();
77 InitializeAllAsmPrinters();
80 LTOCodeGenerator::~LTOCodeGenerator()
83 delete _nativeObjectFile
;
88 bool LTOCodeGenerator::addModule(LTOModule
* mod
, std::string
& errMsg
)
91 if(mod
->getLLVVMModule()->MaterializeAllPermanently(&errMsg
))
94 bool ret
= _linker
.LinkInModule(mod
->getLLVVMModule(), &errMsg
);
96 const std::vector
<const char*> &undefs
= mod
->getAsmUndefinedRefs();
97 for (int i
= 0, e
= undefs
.size(); i
!= e
; ++i
)
98 _asmUndefinedRefs
[undefs
[i
]] = 1;
104 bool LTOCodeGenerator::setDebugInfo(lto_debug_model debug
, std::string
& errMsg
)
107 case LTO_DEBUG_MODEL_NONE
:
108 _emitDwarfDebugInfo
= false;
111 case LTO_DEBUG_MODEL_DWARF
:
112 _emitDwarfDebugInfo
= true;
115 errMsg
= "unknown debug format";
120 bool LTOCodeGenerator::setCodePICModel(lto_codegen_model model
,
124 case LTO_CODEGEN_PIC_MODEL_STATIC
:
125 case LTO_CODEGEN_PIC_MODEL_DYNAMIC
:
126 case LTO_CODEGEN_PIC_MODEL_DYNAMIC_NO_PIC
:
130 errMsg
= "unknown pic model";
134 void LTOCodeGenerator::setCpu(const char* mCpu
)
139 void LTOCodeGenerator::addMustPreserveSymbol(const char* sym
)
141 _mustPreserveSymbols
[sym
] = 1;
145 bool LTOCodeGenerator::writeMergedModules(const char *path
,
146 std::string
&errMsg
) {
147 if (determineTarget(errMsg
))
150 // mark which symbols can not be internalized
151 applyScopeRestrictions();
153 // create output file
155 tool_output_file
Out(path
, ErrInfo
,
156 raw_fd_ostream::F_Binary
);
157 if (!ErrInfo
.empty()) {
158 errMsg
= "could not open bitcode file for writing: ";
163 // write bitcode to it
164 WriteBitcodeToFile(_linker
.getModule(), Out
.os());
167 if (Out
.os().has_error()) {
168 errMsg
= "could not write bitcode file: ";
170 Out
.os().clear_error();
179 bool LTOCodeGenerator::compile_to_file(const char** name
, std::string
& errMsg
)
181 // make unique temp .o file to put generated object file
182 sys::PathWithStatus
uniqueObjPath("lto-llvm.o");
183 if ( uniqueObjPath
.createTemporaryFileOnDisk(false, &errMsg
) ) {
184 uniqueObjPath
.eraseFromDisk();
187 sys::RemoveFileOnSignal(uniqueObjPath
);
189 // generate object file
190 bool genResult
= false;
191 tool_output_file
objFile(uniqueObjPath
.c_str(), errMsg
);
194 genResult
= this->generateObjectFile(objFile
.os(), errMsg
);
195 objFile
.os().close();
196 if (objFile
.os().has_error()) {
197 objFile
.os().clear_error();
202 uniqueObjPath
.eraseFromDisk();
206 _nativeObjectPath
= uniqueObjPath
.str();
207 *name
= _nativeObjectPath
.c_str();
211 const void* LTOCodeGenerator::compile(size_t* length
, std::string
& errMsg
)
214 if (compile_to_file(&name
, errMsg
))
217 // remove old buffer if compile() called twice
218 delete _nativeObjectFile
;
220 // read .o file into memory buffer
221 OwningPtr
<MemoryBuffer
> BuffPtr
;
222 if (error_code ec
= MemoryBuffer::getFile(name
, BuffPtr
, -1, false)) {
223 errMsg
= ec
.message();
226 _nativeObjectFile
= BuffPtr
.take();
229 sys::Path(_nativeObjectPath
).eraseFromDisk();
231 // return buffer, unless error
232 if ( _nativeObjectFile
== NULL
)
234 *length
= _nativeObjectFile
->getBufferSize();
235 return _nativeObjectFile
->getBufferStart();
238 bool LTOCodeGenerator::determineTarget(std::string
& errMsg
)
240 if ( _target
== NULL
) {
241 std::string Triple
= _linker
.getModule()->getTargetTriple();
243 Triple
= sys::getHostTriple();
245 // create target machine from info for merged modules
246 const Target
*march
= TargetRegistry::lookupTarget(Triple
, errMsg
);
250 // The relocation model is actually a static member of TargetMachine
251 // and needs to be set before the TargetMachine is instantiated.
252 switch( _codeModel
) {
253 case LTO_CODEGEN_PIC_MODEL_STATIC
:
254 TargetMachine::setRelocationModel(Reloc::Static
);
256 case LTO_CODEGEN_PIC_MODEL_DYNAMIC
:
257 TargetMachine::setRelocationModel(Reloc::PIC_
);
259 case LTO_CODEGEN_PIC_MODEL_DYNAMIC_NO_PIC
:
260 TargetMachine::setRelocationModel(Reloc::DynamicNoPIC
);
264 // construct LTModule, hand over ownership of module and target
265 SubtargetFeatures Features
;
266 Features
.getDefaultSubtargetFeatures(_mCpu
, llvm::Triple(Triple
));
267 std::string FeatureStr
= Features
.getString();
268 _target
= march
->createTargetMachine(Triple
, FeatureStr
);
273 void LTOCodeGenerator::applyRestriction(GlobalValue
&GV
,
274 std::vector
<const char*> &mustPreserveList
,
275 SmallPtrSet
<GlobalValue
*, 8> &asmUsed
,
277 SmallString
<64> Buffer
;
278 mangler
.getNameWithPrefix(Buffer
, &GV
, false);
280 if (GV
.isDeclaration())
282 if (_mustPreserveSymbols
.count(Buffer
))
283 mustPreserveList
.push_back(GV
.getName().data());
284 if (_asmUndefinedRefs
.count(Buffer
))
288 static void findUsedValues(GlobalVariable
*LLVMUsed
,
289 SmallPtrSet
<GlobalValue
*, 8> &UsedValues
) {
290 if (LLVMUsed
== 0) return;
292 ConstantArray
*Inits
= dyn_cast
<ConstantArray
>(LLVMUsed
->getInitializer());
293 if (Inits
== 0) return;
295 for (unsigned i
= 0, e
= Inits
->getNumOperands(); i
!= e
; ++i
)
296 if (GlobalValue
*GV
=
297 dyn_cast
<GlobalValue
>(Inits
->getOperand(i
)->stripPointerCasts()))
298 UsedValues
.insert(GV
);
301 void LTOCodeGenerator::applyScopeRestrictions() {
302 if (_scopeRestrictionsDone
) return;
303 Module
*mergedModule
= _linker
.getModule();
305 // Start off with a verification pass.
307 passes
.add(createVerifierPass());
309 // mark which symbols can not be internalized
310 MCContext
Context(*_target
->getMCAsmInfo(), NULL
);
311 Mangler
mangler(Context
, *_target
->getTargetData());
312 std::vector
<const char*> mustPreserveList
;
313 SmallPtrSet
<GlobalValue
*, 8> asmUsed
;
315 for (Module::iterator f
= mergedModule
->begin(),
316 e
= mergedModule
->end(); f
!= e
; ++f
)
317 applyRestriction(*f
, mustPreserveList
, asmUsed
, mangler
);
318 for (Module::global_iterator v
= mergedModule
->global_begin(),
319 e
= mergedModule
->global_end(); v
!= e
; ++v
)
320 applyRestriction(*v
, mustPreserveList
, asmUsed
, mangler
);
321 for (Module::alias_iterator a
= mergedModule
->alias_begin(),
322 e
= mergedModule
->alias_end(); a
!= e
; ++a
)
323 applyRestriction(*a
, mustPreserveList
, asmUsed
, mangler
);
325 GlobalVariable
*LLVMCompilerUsed
=
326 mergedModule
->getGlobalVariable("llvm.compiler.used");
327 findUsedValues(LLVMCompilerUsed
, asmUsed
);
328 if (LLVMCompilerUsed
)
329 LLVMCompilerUsed
->eraseFromParent();
331 const llvm::Type
*i8PTy
= llvm::Type::getInt8PtrTy(_context
);
332 std::vector
<Constant
*> asmUsed2
;
333 for (SmallPtrSet
<GlobalValue
*, 16>::const_iterator i
= asmUsed
.begin(),
334 e
= asmUsed
.end(); i
!=e
; ++i
) {
335 GlobalValue
*GV
= *i
;
336 Constant
*c
= ConstantExpr::getBitCast(GV
, i8PTy
);
337 asmUsed2
.push_back(c
);
340 llvm::ArrayType
*ATy
= llvm::ArrayType::get(i8PTy
, asmUsed2
.size());
342 new llvm::GlobalVariable(*mergedModule
, ATy
, false,
343 llvm::GlobalValue::AppendingLinkage
,
344 llvm::ConstantArray::get(ATy
, asmUsed2
),
345 "llvm.compiler.used");
347 LLVMCompilerUsed
->setSection("llvm.metadata");
349 passes
.add(createInternalizePass(mustPreserveList
));
351 // apply scope restrictions
352 passes
.run(*mergedModule
);
354 _scopeRestrictionsDone
= true;
357 /// Optimize merged modules using various IPO passes
358 bool LTOCodeGenerator::generateObjectFile(raw_ostream
& out
,
361 if ( this->determineTarget(errMsg
) )
364 // mark which symbols can not be internalized
365 this->applyScopeRestrictions();
367 Module
* mergedModule
= _linker
.getModule();
369 // if options were requested, set them
370 if ( !_codegenOptions
.empty() )
371 cl::ParseCommandLineOptions(_codegenOptions
.size(),
372 const_cast<char **>(&_codegenOptions
[0]));
374 // Instantiate the pass manager to organize the passes.
377 // Start off with a verification pass.
378 passes
.add(createVerifierPass());
380 // Add an appropriate TargetData instance for this module...
381 passes
.add(new TargetData(*_target
->getTargetData()));
383 createStandardLTOPasses(&passes
, /*Internalize=*/ false, !DisableInline
,
384 /*VerifyEach=*/ false);
386 // Make sure everything is still good.
387 passes
.add(createVerifierPass());
389 FunctionPassManager
* codeGenPasses
= new FunctionPassManager(mergedModule
);
391 codeGenPasses
->add(new TargetData(*_target
->getTargetData()));
393 formatted_raw_ostream
Out(out
);
395 if (_target
->addPassesToEmitFile(*codeGenPasses
, Out
,
396 TargetMachine::CGFT_ObjectFile
,
397 CodeGenOpt::Aggressive
)) {
398 errMsg
= "target file type not supported";
402 // Run our queue of passes all at once now, efficiently.
403 passes
.run(*mergedModule
);
405 // Run the code generator, and write assembly file
406 codeGenPasses
->doInitialization();
408 for (Module::iterator
409 it
= mergedModule
->begin(), e
= mergedModule
->end(); it
!= e
; ++it
)
410 if (!it
->isDeclaration())
411 codeGenPasses
->run(*it
);
413 codeGenPasses
->doFinalization();
414 delete codeGenPasses
;
416 return false; // success
420 /// Optimize merged modules using various IPO passes
421 void LTOCodeGenerator::setCodeGenDebugOptions(const char* options
)
423 for (std::pair
<StringRef
, StringRef
> o
= getToken(options
);
424 !o
.first
.empty(); o
= getToken(o
.second
)) {
425 // ParseCommandLineOptions() expects argv[0] to be program name.
427 if ( _codegenOptions
.empty() )
428 _codegenOptions
.push_back("libLTO");
429 _codegenOptions
.push_back(strdup(o
.first
.str().c_str()));