1 //===-- LTOModule.cpp - LLVM Link Time Optimizer --------------------------===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 // This file implements the Link Time Optimization library. This library is
10 // intended to be used by linker to optimize code at link time.
12 //===----------------------------------------------------------------------===//
14 #include "llvm/LTO/legacy/LTOModule.h"
15 #include "llvm/Bitcode/BitcodeReader.h"
16 #include "llvm/CodeGen/TargetSubtargetInfo.h"
17 #include "llvm/IR/Constants.h"
18 #include "llvm/IR/LLVMContext.h"
19 #include "llvm/IR/Mangler.h"
20 #include "llvm/IR/Metadata.h"
21 #include "llvm/IR/Module.h"
22 #include "llvm/MC/MCExpr.h"
23 #include "llvm/MC/MCInst.h"
24 #include "llvm/MC/MCParser/MCAsmParser.h"
25 #include "llvm/MC/MCSection.h"
26 #include "llvm/MC/MCSubtargetInfo.h"
27 #include "llvm/MC/MCSymbol.h"
28 #include "llvm/MC/TargetRegistry.h"
29 #include "llvm/Object/IRObjectFile.h"
30 #include "llvm/Object/MachO.h"
31 #include "llvm/Object/ObjectFile.h"
32 #include "llvm/Support/FileSystem.h"
33 #include "llvm/Support/MemoryBuffer.h"
34 #include "llvm/Support/Path.h"
35 #include "llvm/Support/SourceMgr.h"
36 #include "llvm/Support/TargetSelect.h"
37 #include "llvm/Target/TargetLoweringObjectFile.h"
38 #include "llvm/TargetParser/Host.h"
39 #include "llvm/TargetParser/SubtargetFeature.h"
40 #include "llvm/TargetParser/Triple.h"
41 #include "llvm/Transforms/Utils/GlobalStatus.h"
42 #include <system_error>
44 using namespace llvm::object
;
46 LTOModule::LTOModule(std::unique_ptr
<Module
> M
, MemoryBufferRef MBRef
,
47 llvm::TargetMachine
*TM
)
48 : Mod(std::move(M
)), MBRef(MBRef
), _target(TM
) {
49 assert(_target
&& "target machine is null");
50 SymTab
.addModule(Mod
.get());
53 LTOModule::~LTOModule() = default;
55 /// isBitcodeFile - Returns 'true' if the file (or memory contents) is LLVM
57 bool LTOModule::isBitcodeFile(const void *Mem
, size_t Length
) {
58 Expected
<MemoryBufferRef
> BCData
= IRObjectFile::findBitcodeInMemBuffer(
59 MemoryBufferRef(StringRef((const char *)Mem
, Length
), "<mem>"));
60 return !errorToBool(BCData
.takeError());
63 bool LTOModule::isBitcodeFile(StringRef Path
) {
64 ErrorOr
<std::unique_ptr
<MemoryBuffer
>> BufferOrErr
=
65 MemoryBuffer::getFile(Path
);
69 Expected
<MemoryBufferRef
> BCData
= IRObjectFile::findBitcodeInMemBuffer(
70 BufferOrErr
.get()->getMemBufferRef());
71 return !errorToBool(BCData
.takeError());
74 bool LTOModule::isThinLTO() {
75 Expected
<BitcodeLTOInfo
> Result
= getBitcodeLTOInfo(MBRef
);
77 logAllUnhandledErrors(Result
.takeError(), errs());
80 return Result
->IsThinLTO
;
83 bool LTOModule::isBitcodeForTarget(MemoryBuffer
*Buffer
,
84 StringRef TriplePrefix
) {
85 Expected
<MemoryBufferRef
> BCOrErr
=
86 IRObjectFile::findBitcodeInMemBuffer(Buffer
->getMemBufferRef());
87 if (errorToBool(BCOrErr
.takeError()))
90 ErrorOr
<std::string
> TripleOrErr
=
91 expectedToErrorOrAndEmitErrors(Context
, getBitcodeTargetTriple(*BCOrErr
));
94 return StringRef(*TripleOrErr
).starts_with(TriplePrefix
);
97 std::string
LTOModule::getProducerString(MemoryBuffer
*Buffer
) {
98 Expected
<MemoryBufferRef
> BCOrErr
=
99 IRObjectFile::findBitcodeInMemBuffer(Buffer
->getMemBufferRef());
100 if (errorToBool(BCOrErr
.takeError()))
103 ErrorOr
<std::string
> ProducerOrErr
= expectedToErrorOrAndEmitErrors(
104 Context
, getBitcodeProducerString(*BCOrErr
));
107 return *ProducerOrErr
;
110 ErrorOr
<std::unique_ptr
<LTOModule
>>
111 LTOModule::createFromFile(LLVMContext
&Context
, StringRef path
,
112 const TargetOptions
&options
) {
113 ErrorOr
<std::unique_ptr
<MemoryBuffer
>> BufferOrErr
=
114 MemoryBuffer::getFile(path
);
115 if (std::error_code EC
= BufferOrErr
.getError()) {
116 Context
.emitError(EC
.message());
119 std::unique_ptr
<MemoryBuffer
> Buffer
= std::move(BufferOrErr
.get());
120 return makeLTOModule(Buffer
->getMemBufferRef(), options
, Context
,
121 /* ShouldBeLazy*/ false);
124 ErrorOr
<std::unique_ptr
<LTOModule
>>
125 LTOModule::createFromOpenFile(LLVMContext
&Context
, int fd
, StringRef path
,
126 size_t size
, const TargetOptions
&options
) {
127 return createFromOpenFileSlice(Context
, fd
, path
, size
, 0, options
);
130 ErrorOr
<std::unique_ptr
<LTOModule
>>
131 LTOModule::createFromOpenFileSlice(LLVMContext
&Context
, int fd
, StringRef path
,
132 size_t map_size
, off_t offset
,
133 const TargetOptions
&options
) {
134 ErrorOr
<std::unique_ptr
<MemoryBuffer
>> BufferOrErr
=
135 MemoryBuffer::getOpenFileSlice(sys::fs::convertFDToNativeFile(fd
), path
,
137 if (std::error_code EC
= BufferOrErr
.getError()) {
138 Context
.emitError(EC
.message());
141 std::unique_ptr
<MemoryBuffer
> Buffer
= std::move(BufferOrErr
.get());
142 return makeLTOModule(Buffer
->getMemBufferRef(), options
, Context
,
143 /* ShouldBeLazy */ false);
146 ErrorOr
<std::unique_ptr
<LTOModule
>>
147 LTOModule::createFromBuffer(LLVMContext
&Context
, const void *mem
,
148 size_t length
, const TargetOptions
&options
,
150 StringRef
Data((const char *)mem
, length
);
151 MemoryBufferRef
Buffer(Data
, path
);
152 return makeLTOModule(Buffer
, options
, Context
, /* ShouldBeLazy */ false);
155 ErrorOr
<std::unique_ptr
<LTOModule
>>
156 LTOModule::createInLocalContext(std::unique_ptr
<LLVMContext
> Context
,
157 const void *mem
, size_t length
,
158 const TargetOptions
&options
, StringRef path
) {
159 StringRef
Data((const char *)mem
, length
);
160 MemoryBufferRef
Buffer(Data
, path
);
161 // If we own a context, we know this is being used only for symbol extraction,
162 // not linking. Be lazy in that case.
163 ErrorOr
<std::unique_ptr
<LTOModule
>> Ret
=
164 makeLTOModule(Buffer
, options
, *Context
, /* ShouldBeLazy */ true);
166 (*Ret
)->OwnedContext
= std::move(Context
);
170 static ErrorOr
<std::unique_ptr
<Module
>>
171 parseBitcodeFileImpl(MemoryBufferRef Buffer
, LLVMContext
&Context
,
174 Expected
<MemoryBufferRef
> MBOrErr
=
175 IRObjectFile::findBitcodeInMemBuffer(Buffer
);
176 if (Error E
= MBOrErr
.takeError()) {
177 std::error_code EC
= errorToErrorCode(std::move(E
));
178 Context
.emitError(EC
.message());
183 // Parse the full file.
184 return expectedToErrorOrAndEmitErrors(Context
,
185 parseBitcodeFile(*MBOrErr
, Context
));
189 return expectedToErrorOrAndEmitErrors(
191 getLazyBitcodeModule(*MBOrErr
, Context
, true /*ShouldLazyLoadMetadata*/));
194 ErrorOr
<std::unique_ptr
<LTOModule
>>
195 LTOModule::makeLTOModule(MemoryBufferRef Buffer
, const TargetOptions
&options
,
196 LLVMContext
&Context
, bool ShouldBeLazy
) {
197 ErrorOr
<std::unique_ptr
<Module
>> MOrErr
=
198 parseBitcodeFileImpl(Buffer
, Context
, ShouldBeLazy
);
199 if (std::error_code EC
= MOrErr
.getError())
201 std::unique_ptr
<Module
> &M
= *MOrErr
;
203 std::string TripleStr
= M
->getTargetTriple();
204 if (TripleStr
.empty())
205 TripleStr
= sys::getDefaultTargetTriple();
206 llvm::Triple
Triple(TripleStr
);
208 // find machine architecture for this module
210 const Target
*march
= TargetRegistry::lookupTarget(TripleStr
, errMsg
);
212 return make_error_code(object::object_error::arch_not_found
);
214 // construct LTOModule, hand over ownership of module and target
215 SubtargetFeatures Features
;
216 Features
.getDefaultSubtargetFeatures(Triple
);
217 std::string FeatureStr
= Features
.getString();
218 // Set a default CPU for Darwin triples.
220 if (Triple
.isOSDarwin()) {
221 if (Triple
.getArch() == llvm::Triple::x86_64
)
223 else if (Triple
.getArch() == llvm::Triple::x86
)
225 else if (Triple
.isArm64e())
227 else if (Triple
.getArch() == llvm::Triple::aarch64
||
228 Triple
.getArch() == llvm::Triple::aarch64_32
)
232 TargetMachine
*target
= march
->createTargetMachine(TripleStr
, CPU
, FeatureStr
,
233 options
, std::nullopt
);
235 std::unique_ptr
<LTOModule
> Ret(new LTOModule(std::move(M
), Buffer
, target
));
237 Ret
->parseMetadata();
239 return std::move(Ret
);
242 /// Create a MemoryBuffer from a memory range with an optional name.
243 std::unique_ptr
<MemoryBuffer
>
244 LTOModule::makeBuffer(const void *mem
, size_t length
, StringRef name
) {
245 const char *startPtr
= (const char*)mem
;
246 return MemoryBuffer::getMemBuffer(StringRef(startPtr
, length
), name
, false);
249 /// objcClassNameFromExpression - Get string that the data pointer points to.
251 LTOModule::objcClassNameFromExpression(const Constant
*c
, std::string
&name
) {
252 if (const ConstantExpr
*ce
= dyn_cast
<ConstantExpr
>(c
)) {
253 Constant
*op
= ce
->getOperand(0);
254 if (GlobalVariable
*gvn
= dyn_cast
<GlobalVariable
>(op
)) {
255 Constant
*cn
= gvn
->getInitializer();
256 if (ConstantDataArray
*ca
= dyn_cast
<ConstantDataArray
>(cn
)) {
257 if (ca
->isCString()) {
258 name
= (".objc_class_name_" + ca
->getAsCString()).str();
267 /// addObjCClass - Parse i386/ppc ObjC class data structure.
268 void LTOModule::addObjCClass(const GlobalVariable
*clgv
) {
269 const ConstantStruct
*c
= dyn_cast
<ConstantStruct
>(clgv
->getInitializer());
272 // second slot in __OBJC,__class is pointer to superclass name
273 std::string superclassName
;
274 if (objcClassNameFromExpression(c
->getOperand(1), superclassName
)) {
276 _undefines
.insert(std::make_pair(superclassName
, NameAndAttributes()));
277 if (IterBool
.second
) {
278 NameAndAttributes
&info
= IterBool
.first
->second
;
279 info
.name
= IterBool
.first
->first();
280 info
.attributes
= LTO_SYMBOL_DEFINITION_UNDEFINED
;
281 info
.isFunction
= false;
286 // third slot in __OBJC,__class is pointer to class name
287 std::string className
;
288 if (objcClassNameFromExpression(c
->getOperand(2), className
)) {
289 auto Iter
= _defines
.insert(className
).first
;
291 NameAndAttributes info
;
292 info
.name
= Iter
->first();
293 info
.attributes
= LTO_SYMBOL_PERMISSIONS_DATA
|
294 LTO_SYMBOL_DEFINITION_REGULAR
| LTO_SYMBOL_SCOPE_DEFAULT
;
295 info
.isFunction
= false;
297 _symbols
.push_back(info
);
301 /// addObjCCategory - Parse i386/ppc ObjC category data structure.
302 void LTOModule::addObjCCategory(const GlobalVariable
*clgv
) {
303 const ConstantStruct
*c
= dyn_cast
<ConstantStruct
>(clgv
->getInitializer());
306 // second slot in __OBJC,__category is pointer to target class name
307 std::string targetclassName
;
308 if (!objcClassNameFromExpression(c
->getOperand(1), targetclassName
))
312 _undefines
.insert(std::make_pair(targetclassName
, NameAndAttributes()));
314 if (!IterBool
.second
)
317 NameAndAttributes
&info
= IterBool
.first
->second
;
318 info
.name
= IterBool
.first
->first();
319 info
.attributes
= LTO_SYMBOL_DEFINITION_UNDEFINED
;
320 info
.isFunction
= false;
324 /// addObjCClassRef - Parse i386/ppc ObjC class list data structure.
325 void LTOModule::addObjCClassRef(const GlobalVariable
*clgv
) {
326 std::string targetclassName
;
327 if (!objcClassNameFromExpression(clgv
->getInitializer(), targetclassName
))
331 _undefines
.insert(std::make_pair(targetclassName
, NameAndAttributes()));
333 if (!IterBool
.second
)
336 NameAndAttributes
&info
= IterBool
.first
->second
;
337 info
.name
= IterBool
.first
->first();
338 info
.attributes
= LTO_SYMBOL_DEFINITION_UNDEFINED
;
339 info
.isFunction
= false;
343 void LTOModule::addDefinedDataSymbol(ModuleSymbolTable::Symbol Sym
) {
344 SmallString
<64> Buffer
;
346 raw_svector_ostream
OS(Buffer
);
347 SymTab
.printSymbolName(OS
, Sym
);
351 const GlobalValue
*V
= cast
<GlobalValue
*>(Sym
);
352 addDefinedDataSymbol(Buffer
, V
);
355 void LTOModule::addDefinedDataSymbol(StringRef Name
, const GlobalValue
*v
) {
356 // Add to list of defined symbols.
357 addDefinedSymbol(Name
, v
, false);
359 if (!v
->hasSection() /* || !isTargetDarwin */)
362 // Special case i386/ppc ObjC data structures in magic sections:
363 // The issue is that the old ObjC object format did some strange
364 // contortions to avoid real linker symbols. For instance, the
365 // ObjC class data structure is allocated statically in the executable
366 // that defines that class. That data structures contains a pointer to
367 // its superclass. But instead of just initializing that part of the
368 // struct to the address of its superclass, and letting the static and
369 // dynamic linkers do the rest, the runtime works by having that field
370 // instead point to a C-string that is the name of the superclass.
371 // At runtime the objc initialization updates that pointer and sets
372 // it to point to the actual super class. As far as the linker
373 // knows it is just a pointer to a string. But then someone wanted the
374 // linker to issue errors at build time if the superclass was not found.
375 // So they figured out a way in mach-o object format to use an absolute
376 // symbols (.objc_class_name_Foo = 0) and a floating reference
377 // (.reference .objc_class_name_Bar) to cause the linker into erroring when
378 // a class was missing.
379 // The following synthesizes the implicit .objc_* symbols for the linker
380 // from the ObjC data structures generated by the front end.
382 // special case if this data blob is an ObjC class definition
383 if (const GlobalVariable
*GV
= dyn_cast
<GlobalVariable
>(v
)) {
384 StringRef Section
= GV
->getSection();
385 if (Section
.starts_with("__OBJC,__class,")) {
389 // special case if this data blob is an ObjC category definition
390 else if (Section
.starts_with("__OBJC,__category,")) {
394 // special case if this data blob is the list of referenced classes
395 else if (Section
.starts_with("__OBJC,__cls_refs,")) {
401 void LTOModule::addDefinedFunctionSymbol(ModuleSymbolTable::Symbol Sym
) {
402 SmallString
<64> Buffer
;
404 raw_svector_ostream
OS(Buffer
);
405 SymTab
.printSymbolName(OS
, Sym
);
409 const Function
*F
= cast
<Function
>(cast
<GlobalValue
*>(Sym
));
410 addDefinedFunctionSymbol(Buffer
, F
);
413 void LTOModule::addDefinedFunctionSymbol(StringRef Name
, const Function
*F
) {
414 // add to list of defined symbols
415 addDefinedSymbol(Name
, F
, true);
418 void LTOModule::addDefinedSymbol(StringRef Name
, const GlobalValue
*def
,
420 const GlobalObject
*go
= dyn_cast
<GlobalObject
>(def
);
421 uint32_t attr
= go
? Log2(go
->getAlign().valueOrOne()) : 0;
423 // set permissions part
425 attr
|= LTO_SYMBOL_PERMISSIONS_CODE
;
427 const GlobalVariable
*gv
= dyn_cast
<GlobalVariable
>(def
);
428 if (gv
&& gv
->isConstant())
429 attr
|= LTO_SYMBOL_PERMISSIONS_RODATA
;
431 attr
|= LTO_SYMBOL_PERMISSIONS_DATA
;
434 // set definition part
435 if (def
->hasWeakLinkage() || def
->hasLinkOnceLinkage())
436 attr
|= LTO_SYMBOL_DEFINITION_WEAK
;
437 else if (def
->hasCommonLinkage())
438 attr
|= LTO_SYMBOL_DEFINITION_TENTATIVE
;
440 attr
|= LTO_SYMBOL_DEFINITION_REGULAR
;
443 if (def
->hasLocalLinkage())
444 // Ignore visibility if linkage is local.
445 attr
|= LTO_SYMBOL_SCOPE_INTERNAL
;
446 else if (def
->hasHiddenVisibility())
447 attr
|= LTO_SYMBOL_SCOPE_HIDDEN
;
448 else if (def
->hasProtectedVisibility())
449 attr
|= LTO_SYMBOL_SCOPE_PROTECTED
;
450 else if (def
->canBeOmittedFromSymbolTable())
451 attr
|= LTO_SYMBOL_SCOPE_DEFAULT_CAN_BE_HIDDEN
;
453 attr
|= LTO_SYMBOL_SCOPE_DEFAULT
;
455 if (def
->hasComdat())
456 attr
|= LTO_SYMBOL_COMDAT
;
458 if (isa
<GlobalAlias
>(def
))
459 attr
|= LTO_SYMBOL_ALIAS
;
461 auto Iter
= _defines
.insert(Name
).first
;
463 // fill information structure
464 NameAndAttributes info
;
465 StringRef NameRef
= Iter
->first();
467 assert(NameRef
.data()[NameRef
.size()] == '\0');
468 info
.attributes
= attr
;
469 info
.isFunction
= isFunction
;
472 // add to table of symbols
473 _symbols
.push_back(info
);
476 /// addAsmGlobalSymbol - Add a global symbol from module-level ASM to the
478 void LTOModule::addAsmGlobalSymbol(StringRef name
,
479 lto_symbol_attributes scope
) {
480 auto IterBool
= _defines
.insert(name
);
482 // only add new define if not already defined
483 if (!IterBool
.second
)
486 NameAndAttributes
&info
= _undefines
[IterBool
.first
->first()];
488 if (info
.symbol
== nullptr) {
489 // FIXME: This is trying to take care of module ASM like this:
491 // module asm ".zerofill __FOO, __foo, _bar_baz_qux, 0"
493 // but is gross and its mother dresses it funny. Have the ASM parser give us
494 // more details for this type of situation so that we're not guessing so
497 // fill information structure
498 info
.name
= IterBool
.first
->first();
500 LTO_SYMBOL_PERMISSIONS_DATA
| LTO_SYMBOL_DEFINITION_REGULAR
| scope
;
501 info
.isFunction
= false;
502 info
.symbol
= nullptr;
504 // add to table of symbols
505 _symbols
.push_back(info
);
510 addDefinedFunctionSymbol(info
.name
, cast
<Function
>(info
.symbol
));
512 addDefinedDataSymbol(info
.name
, info
.symbol
);
514 _symbols
.back().attributes
&= ~LTO_SYMBOL_SCOPE_MASK
;
515 _symbols
.back().attributes
|= scope
;
518 /// addAsmGlobalSymbolUndef - Add a global symbol from module-level ASM to the
520 void LTOModule::addAsmGlobalSymbolUndef(StringRef name
) {
521 auto IterBool
= _undefines
.insert(std::make_pair(name
, NameAndAttributes()));
523 _asm_undefines
.push_back(IterBool
.first
->first());
525 // we already have the symbol
526 if (!IterBool
.second
)
529 uint32_t attr
= LTO_SYMBOL_DEFINITION_UNDEFINED
;
530 attr
|= LTO_SYMBOL_SCOPE_DEFAULT
;
531 NameAndAttributes
&info
= IterBool
.first
->second
;
532 info
.name
= IterBool
.first
->first();
533 info
.attributes
= attr
;
534 info
.isFunction
= false;
535 info
.symbol
= nullptr;
538 /// Add a symbol which isn't defined just yet to a list to be resolved later.
539 void LTOModule::addPotentialUndefinedSymbol(ModuleSymbolTable::Symbol Sym
,
541 SmallString
<64> name
;
543 raw_svector_ostream
OS(name
);
544 SymTab
.printSymbolName(OS
, Sym
);
549 _undefines
.insert(std::make_pair(name
.str(), NameAndAttributes()));
551 // we already have the symbol
552 if (!IterBool
.second
)
555 NameAndAttributes
&info
= IterBool
.first
->second
;
557 info
.name
= IterBool
.first
->first();
559 const GlobalValue
*decl
= dyn_cast_if_present
<GlobalValue
*>(Sym
);
561 if (decl
->hasExternalWeakLinkage())
562 info
.attributes
= LTO_SYMBOL_DEFINITION_WEAKUNDEF
;
564 info
.attributes
= LTO_SYMBOL_DEFINITION_UNDEFINED
;
566 info
.isFunction
= isFunc
;
570 void LTOModule::parseSymbols() {
571 for (auto Sym
: SymTab
.symbols()) {
572 auto *GV
= dyn_cast_if_present
<GlobalValue
*>(Sym
);
573 uint32_t Flags
= SymTab
.getSymbolFlags(Sym
);
574 if (Flags
& object::BasicSymbolRef::SF_FormatSpecific
)
577 bool IsUndefined
= Flags
& object::BasicSymbolRef::SF_Undefined
;
580 SmallString
<64> Buffer
;
582 raw_svector_ostream
OS(Buffer
);
583 SymTab
.printSymbolName(OS
, Sym
);
586 StringRef Name
= Buffer
;
589 addAsmGlobalSymbolUndef(Name
);
590 else if (Flags
& object::BasicSymbolRef::SF_Global
)
591 addAsmGlobalSymbol(Name
, LTO_SYMBOL_SCOPE_DEFAULT
);
593 addAsmGlobalSymbol(Name
, LTO_SYMBOL_SCOPE_INTERNAL
);
597 auto *F
= dyn_cast
<Function
>(GV
);
599 addPotentialUndefinedSymbol(Sym
, F
!= nullptr);
604 addDefinedFunctionSymbol(Sym
);
608 if (isa
<GlobalVariable
>(GV
)) {
609 addDefinedDataSymbol(Sym
);
613 assert(isa
<GlobalAlias
>(GV
));
614 addDefinedDataSymbol(Sym
);
617 // make symbols for all undefines
618 for (StringMap
<NameAndAttributes
>::iterator u
=_undefines
.begin(),
619 e
= _undefines
.end(); u
!= e
; ++u
) {
620 // If this symbol also has a definition, then don't make an undefine because
621 // it is a tentative definition.
622 if (_defines
.count(u
->getKey())) continue;
623 NameAndAttributes info
= u
->getValue();
624 _symbols
.push_back(info
);
628 /// parseMetadata - Parse metadata from the module
629 void LTOModule::parseMetadata() {
630 raw_string_ostream
OS(LinkerOpts
);
633 if (NamedMDNode
*LinkerOptions
=
634 getModule().getNamedMetadata("llvm.linker.options")) {
635 for (unsigned i
= 0, e
= LinkerOptions
->getNumOperands(); i
!= e
; ++i
) {
636 MDNode
*MDOptions
= LinkerOptions
->getOperand(i
);
637 for (unsigned ii
= 0, ie
= MDOptions
->getNumOperands(); ii
!= ie
; ++ii
) {
638 MDString
*MDOption
= cast
<MDString
>(MDOptions
->getOperand(ii
));
639 OS
<< " " << MDOption
->getString();
644 // Globals - we only need to do this for COFF.
645 const Triple
TT(_target
->getTargetTriple());
646 if (!TT
.isOSBinFormatCOFF())
649 for (const NameAndAttributes
&Sym
: _symbols
) {
652 emitLinkerFlagsForGlobalCOFF(OS
, Sym
.symbol
, TT
, M
);
656 lto::InputFile
*LTOModule::createInputFile(const void *buffer
,
657 size_t buffer_size
, const char *path
,
658 std::string
&outErr
) {
659 StringRef
Data((const char *)buffer
, buffer_size
);
660 MemoryBufferRef
BufferRef(Data
, path
);
662 Expected
<std::unique_ptr
<lto::InputFile
>> ObjOrErr
=
663 lto::InputFile::create(BufferRef
);
666 return ObjOrErr
->release();
668 outErr
= std::string(path
) +
669 ": Could not read LTO input file: " + toString(ObjOrErr
.takeError());
673 size_t LTOModule::getDependentLibraryCount(lto::InputFile
*input
) {
674 return input
->getDependentLibraries().size();
677 const char *LTOModule::getDependentLibrary(lto::InputFile
*input
, size_t index
,
679 StringRef S
= input
->getDependentLibraries()[index
];
684 Expected
<uint32_t> LTOModule::getMachOCPUType() const {
685 return MachO::getCPUType(Triple(Mod
->getTargetTriple()));
688 Expected
<uint32_t> LTOModule::getMachOCPUSubType() const {
689 return MachO::getCPUSubType(Triple(Mod
->getTargetTriple()));
692 bool LTOModule::hasCtorDtor() const {
693 for (auto Sym
: SymTab
.symbols()) {
694 if (auto *GV
= dyn_cast_if_present
<GlobalValue
*>(Sym
)) {
695 StringRef Name
= GV
->getName();
696 if (Name
.consume_front("llvm.global_")) {
697 if (Name
.equals("ctors") || Name
.equals("dtors"))