1 //===-- LTOModule.cpp - LLVM Link Time Optimizer --------------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 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. 12 // 13 //===----------------------------------------------------------------------===// 14 15 #include "llvm/LTO/LTOModule.h" 16 #include "llvm/ADT/Triple.h" 17 #include "llvm/Bitcode/ReaderWriter.h" 18 #include "llvm/CodeGen/Analysis.h" 19 #include "llvm/IR/Constants.h" 20 #include "llvm/IR/LLVMContext.h" 21 #include "llvm/IR/Metadata.h" 22 #include "llvm/IR/Module.h" 23 #include "llvm/MC/MCExpr.h" 24 #include "llvm/MC/MCInst.h" 25 #include "llvm/MC/MCInstrInfo.h" 26 #include "llvm/MC/MCParser/MCAsmParser.h" 27 #include "llvm/MC/MCSection.h" 28 #include "llvm/MC/MCSubtargetInfo.h" 29 #include "llvm/MC/MCSymbol.h" 30 #include "llvm/MC/MCTargetAsmParser.h" 31 #include "llvm/MC/SubtargetFeature.h" 32 #include "llvm/Object/IRObjectFile.h" 33 #include "llvm/Object/ObjectFile.h" 34 #include "llvm/Support/CommandLine.h" 35 #include "llvm/Support/FileSystem.h" 36 #include "llvm/Support/Host.h" 37 #include "llvm/Support/MemoryBuffer.h" 38 #include "llvm/Support/Path.h" 39 #include "llvm/Support/SourceMgr.h" 40 #include "llvm/Support/TargetRegistry.h" 41 #include "llvm/Support/TargetSelect.h" 42 #include "llvm/Target/TargetLowering.h" 43 #include "llvm/Target/TargetLoweringObjectFile.h" 44 #include "llvm/Target/TargetRegisterInfo.h" 45 #include "llvm/Target/TargetSubtargetInfo.h" 46 #include "llvm/Transforms/Utils/GlobalStatus.h" 47 #include <system_error> 48 using namespace llvm; 49 using namespace llvm::object; 50 51 LTOModule::LTOModule(std::unique_ptr<object::IRObjectFile> Obj, 52 llvm::TargetMachine *TM) 53 : IRFile(std::move(Obj)), _target(TM) {} 54 55 /// isBitcodeFile - Returns 'true' if the file (or memory contents) is LLVM 56 /// bitcode. 57 bool LTOModule::isBitcodeFile(const void *Mem, size_t Length) { 58 ErrorOr<MemoryBufferRef> BCData = IRObjectFile::findBitcodeInMemBuffer( 59 MemoryBufferRef(StringRef((const char *)Mem, Length), "<mem>")); 60 return bool(BCData); 61 } 62 63 bool LTOModule::isBitcodeFile(const char *Path) { 64 ErrorOr<std::unique_ptr<MemoryBuffer>> BufferOrErr = 65 MemoryBuffer::getFile(Path); 66 if (!BufferOrErr) 67 return false; 68 69 ErrorOr<MemoryBufferRef> BCData = IRObjectFile::findBitcodeInMemBuffer( 70 BufferOrErr.get()->getMemBufferRef()); 71 return bool(BCData); 72 } 73 74 bool LTOModule::isBitcodeForTarget(MemoryBuffer *Buffer, 75 StringRef TriplePrefix) { 76 ErrorOr<MemoryBufferRef> BCOrErr = 77 IRObjectFile::findBitcodeInMemBuffer(Buffer->getMemBufferRef()); 78 if (!BCOrErr) 79 return false; 80 std::string Triple = getBitcodeTargetTriple(*BCOrErr, getGlobalContext()); 81 return StringRef(Triple).startswith(TriplePrefix); 82 } 83 84 LTOModule *LTOModule::createFromFile(const char *path, TargetOptions options, 85 std::string &errMsg) { 86 ErrorOr<std::unique_ptr<MemoryBuffer>> BufferOrErr = 87 MemoryBuffer::getFile(path); 88 if (std::error_code EC = BufferOrErr.getError()) { 89 errMsg = EC.message(); 90 return nullptr; 91 } 92 std::unique_ptr<MemoryBuffer> Buffer = std::move(BufferOrErr.get()); 93 return makeLTOModule(Buffer->getMemBufferRef(), options, errMsg); 94 } 95 96 LTOModule *LTOModule::createFromOpenFile(int fd, const char *path, size_t size, 97 TargetOptions options, 98 std::string &errMsg) { 99 return createFromOpenFileSlice(fd, path, size, 0, options, errMsg); 100 } 101 102 LTOModule *LTOModule::createFromOpenFileSlice(int fd, const char *path, 103 size_t map_size, off_t offset, 104 TargetOptions options, 105 std::string &errMsg) { 106 ErrorOr<std::unique_ptr<MemoryBuffer>> BufferOrErr = 107 MemoryBuffer::getOpenFileSlice(fd, path, map_size, offset); 108 if (std::error_code EC = BufferOrErr.getError()) { 109 errMsg = EC.message(); 110 return nullptr; 111 } 112 std::unique_ptr<MemoryBuffer> Buffer = std::move(BufferOrErr.get()); 113 return makeLTOModule(Buffer->getMemBufferRef(), options, errMsg); 114 } 115 116 LTOModule *LTOModule::createFromBuffer(const void *mem, size_t length, 117 TargetOptions options, 118 std::string &errMsg, StringRef path) { 119 StringRef Data((const char *)mem, length); 120 MemoryBufferRef Buffer(Data, path); 121 return makeLTOModule(Buffer, options, errMsg); 122 } 123 124 LTOModule *LTOModule::makeLTOModule(MemoryBufferRef Buffer, 125 TargetOptions options, 126 std::string &errMsg) { 127 ErrorOr<MemoryBufferRef> MBOrErr = 128 IRObjectFile::findBitcodeInMemBuffer(Buffer); 129 if (std::error_code EC = MBOrErr.getError()) { 130 errMsg = EC.message(); 131 return nullptr; 132 } 133 ErrorOr<Module *> MOrErr = parseBitcodeFile(*MBOrErr, getGlobalContext()); 134 if (std::error_code EC = MOrErr.getError()) { 135 errMsg = EC.message(); 136 return nullptr; 137 } 138 std::unique_ptr<Module> M(MOrErr.get()); 139 140 std::string TripleStr = M->getTargetTriple(); 141 if (TripleStr.empty()) 142 TripleStr = sys::getDefaultTargetTriple(); 143 llvm::Triple Triple(TripleStr); 144 145 // find machine architecture for this module 146 const Target *march = TargetRegistry::lookupTarget(TripleStr, errMsg); 147 if (!march) 148 return nullptr; 149 150 // construct LTOModule, hand over ownership of module and target 151 SubtargetFeatures Features; 152 Features.getDefaultSubtargetFeatures(Triple); 153 std::string FeatureStr = Features.getString(); 154 // Set a default CPU for Darwin triples. 155 std::string CPU; 156 if (Triple.isOSDarwin()) { 157 if (Triple.getArch() == llvm::Triple::x86_64) 158 CPU = "core2"; 159 else if (Triple.getArch() == llvm::Triple::x86) 160 CPU = "yonah"; 161 else if (Triple.getArch() == llvm::Triple::aarch64) 162 CPU = "cyclone"; 163 } 164 165 TargetMachine *target = march->createTargetMachine(TripleStr, CPU, FeatureStr, 166 options); 167 M->setDataLayout(target->getSubtargetImpl()->getDataLayout()); 168 169 std::unique_ptr<object::IRObjectFile> IRObj( 170 new object::IRObjectFile(Buffer, std::move(M))); 171 172 LTOModule *Ret = new LTOModule(std::move(IRObj), target); 173 174 if (Ret->parseSymbols(errMsg)) { 175 delete Ret; 176 return nullptr; 177 } 178 179 Ret->parseMetadata(); 180 181 return Ret; 182 } 183 184 /// Create a MemoryBuffer from a memory range with an optional name. 185 std::unique_ptr<MemoryBuffer> 186 LTOModule::makeBuffer(const void *mem, size_t length, StringRef name) { 187 const char *startPtr = (const char*)mem; 188 return MemoryBuffer::getMemBuffer(StringRef(startPtr, length), name, false); 189 } 190 191 /// objcClassNameFromExpression - Get string that the data pointer points to. 192 bool 193 LTOModule::objcClassNameFromExpression(const Constant *c, std::string &name) { 194 if (const ConstantExpr *ce = dyn_cast<ConstantExpr>(c)) { 195 Constant *op = ce->getOperand(0); 196 if (GlobalVariable *gvn = dyn_cast<GlobalVariable>(op)) { 197 Constant *cn = gvn->getInitializer(); 198 if (ConstantDataArray *ca = dyn_cast<ConstantDataArray>(cn)) { 199 if (ca->isCString()) { 200 name = ".objc_class_name_" + ca->getAsCString().str(); 201 return true; 202 } 203 } 204 } 205 } 206 return false; 207 } 208 209 /// addObjCClass - Parse i386/ppc ObjC class data structure. 210 void LTOModule::addObjCClass(const GlobalVariable *clgv) { 211 const ConstantStruct *c = dyn_cast<ConstantStruct>(clgv->getInitializer()); 212 if (!c) return; 213 214 // second slot in __OBJC,__class is pointer to superclass name 215 std::string superclassName; 216 if (objcClassNameFromExpression(c->getOperand(1), superclassName)) { 217 NameAndAttributes info; 218 StringMap<NameAndAttributes>::value_type &entry = 219 _undefines.GetOrCreateValue(superclassName); 220 if (!entry.getValue().name) { 221 const char *symbolName = entry.getKey().data(); 222 info.name = symbolName; 223 info.attributes = LTO_SYMBOL_DEFINITION_UNDEFINED; 224 info.isFunction = false; 225 info.symbol = clgv; 226 entry.setValue(info); 227 } 228 } 229 230 // third slot in __OBJC,__class is pointer to class name 231 std::string className; 232 if (objcClassNameFromExpression(c->getOperand(2), className)) { 233 StringSet::value_type &entry = _defines.GetOrCreateValue(className); 234 entry.setValue(1); 235 236 NameAndAttributes info; 237 info.name = entry.getKey().data(); 238 info.attributes = LTO_SYMBOL_PERMISSIONS_DATA | 239 LTO_SYMBOL_DEFINITION_REGULAR | LTO_SYMBOL_SCOPE_DEFAULT; 240 info.isFunction = false; 241 info.symbol = clgv; 242 _symbols.push_back(info); 243 } 244 } 245 246 /// addObjCCategory - Parse i386/ppc ObjC category data structure. 247 void LTOModule::addObjCCategory(const GlobalVariable *clgv) { 248 const ConstantStruct *c = dyn_cast<ConstantStruct>(clgv->getInitializer()); 249 if (!c) return; 250 251 // second slot in __OBJC,__category is pointer to target class name 252 std::string targetclassName; 253 if (!objcClassNameFromExpression(c->getOperand(1), targetclassName)) 254 return; 255 256 NameAndAttributes info; 257 StringMap<NameAndAttributes>::value_type &entry = 258 _undefines.GetOrCreateValue(targetclassName); 259 260 if (entry.getValue().name) 261 return; 262 263 const char *symbolName = entry.getKey().data(); 264 info.name = symbolName; 265 info.attributes = LTO_SYMBOL_DEFINITION_UNDEFINED; 266 info.isFunction = false; 267 info.symbol = clgv; 268 entry.setValue(info); 269 } 270 271 /// addObjCClassRef - Parse i386/ppc ObjC class list data structure. 272 void LTOModule::addObjCClassRef(const GlobalVariable *clgv) { 273 std::string targetclassName; 274 if (!objcClassNameFromExpression(clgv->getInitializer(), targetclassName)) 275 return; 276 277 NameAndAttributes info; 278 StringMap<NameAndAttributes>::value_type &entry = 279 _undefines.GetOrCreateValue(targetclassName); 280 if (entry.getValue().name) 281 return; 282 283 const char *symbolName = entry.getKey().data(); 284 info.name = symbolName; 285 info.attributes = LTO_SYMBOL_DEFINITION_UNDEFINED; 286 info.isFunction = false; 287 info.symbol = clgv; 288 entry.setValue(info); 289 } 290 291 void LTOModule::addDefinedDataSymbol(const object::BasicSymbolRef &Sym) { 292 SmallString<64> Buffer; 293 { 294 raw_svector_ostream OS(Buffer); 295 Sym.printName(OS); 296 } 297 298 const GlobalValue *V = IRFile->getSymbolGV(Sym.getRawDataRefImpl()); 299 addDefinedDataSymbol(Buffer.c_str(), V); 300 } 301 302 void LTOModule::addDefinedDataSymbol(const char *Name, const GlobalValue *v) { 303 // Add to list of defined symbols. 304 addDefinedSymbol(Name, v, false); 305 306 if (!v->hasSection() /* || !isTargetDarwin */) 307 return; 308 309 // Special case i386/ppc ObjC data structures in magic sections: 310 // The issue is that the old ObjC object format did some strange 311 // contortions to avoid real linker symbols. For instance, the 312 // ObjC class data structure is allocated statically in the executable 313 // that defines that class. That data structures contains a pointer to 314 // its superclass. But instead of just initializing that part of the 315 // struct to the address of its superclass, and letting the static and 316 // dynamic linkers do the rest, the runtime works by having that field 317 // instead point to a C-string that is the name of the superclass. 318 // At runtime the objc initialization updates that pointer and sets 319 // it to point to the actual super class. As far as the linker 320 // knows it is just a pointer to a string. But then someone wanted the 321 // linker to issue errors at build time if the superclass was not found. 322 // So they figured out a way in mach-o object format to use an absolute 323 // symbols (.objc_class_name_Foo = 0) and a floating reference 324 // (.reference .objc_class_name_Bar) to cause the linker into erroring when 325 // a class was missing. 326 // The following synthesizes the implicit .objc_* symbols for the linker 327 // from the ObjC data structures generated by the front end. 328 329 // special case if this data blob is an ObjC class definition 330 std::string Section = v->getSection(); 331 if (Section.compare(0, 15, "__OBJC,__class,") == 0) { 332 if (const GlobalVariable *gv = dyn_cast<GlobalVariable>(v)) { 333 addObjCClass(gv); 334 } 335 } 336 337 // special case if this data blob is an ObjC category definition 338 else if (Section.compare(0, 18, "__OBJC,__category,") == 0) { 339 if (const GlobalVariable *gv = dyn_cast<GlobalVariable>(v)) { 340 addObjCCategory(gv); 341 } 342 } 343 344 // special case if this data blob is the list of referenced classes 345 else if (Section.compare(0, 18, "__OBJC,__cls_refs,") == 0) { 346 if (const GlobalVariable *gv = dyn_cast<GlobalVariable>(v)) { 347 addObjCClassRef(gv); 348 } 349 } 350 } 351 352 void LTOModule::addDefinedFunctionSymbol(const object::BasicSymbolRef &Sym) { 353 SmallString<64> Buffer; 354 { 355 raw_svector_ostream OS(Buffer); 356 Sym.printName(OS); 357 } 358 359 const Function *F = 360 cast<Function>(IRFile->getSymbolGV(Sym.getRawDataRefImpl())); 361 addDefinedFunctionSymbol(Buffer.c_str(), F); 362 } 363 364 void LTOModule::addDefinedFunctionSymbol(const char *Name, const Function *F) { 365 // add to list of defined symbols 366 addDefinedSymbol(Name, F, true); 367 } 368 369 void LTOModule::addDefinedSymbol(const char *Name, const GlobalValue *def, 370 bool isFunction) { 371 // set alignment part log2() can have rounding errors 372 uint32_t align = def->getAlignment(); 373 uint32_t attr = align ? countTrailingZeros(align) : 0; 374 375 // set permissions part 376 if (isFunction) { 377 attr |= LTO_SYMBOL_PERMISSIONS_CODE; 378 } else { 379 const GlobalVariable *gv = dyn_cast<GlobalVariable>(def); 380 if (gv && gv->isConstant()) 381 attr |= LTO_SYMBOL_PERMISSIONS_RODATA; 382 else 383 attr |= LTO_SYMBOL_PERMISSIONS_DATA; 384 } 385 386 // set definition part 387 if (def->hasWeakLinkage() || def->hasLinkOnceLinkage()) 388 attr |= LTO_SYMBOL_DEFINITION_WEAK; 389 else if (def->hasCommonLinkage()) 390 attr |= LTO_SYMBOL_DEFINITION_TENTATIVE; 391 else 392 attr |= LTO_SYMBOL_DEFINITION_REGULAR; 393 394 // set scope part 395 if (def->hasLocalLinkage()) 396 // Ignore visibility if linkage is local. 397 attr |= LTO_SYMBOL_SCOPE_INTERNAL; 398 else if (def->hasHiddenVisibility()) 399 attr |= LTO_SYMBOL_SCOPE_HIDDEN; 400 else if (def->hasProtectedVisibility()) 401 attr |= LTO_SYMBOL_SCOPE_PROTECTED; 402 else if (canBeOmittedFromSymbolTable(def)) 403 attr |= LTO_SYMBOL_SCOPE_DEFAULT_CAN_BE_HIDDEN; 404 else 405 attr |= LTO_SYMBOL_SCOPE_DEFAULT; 406 407 StringSet::value_type &entry = _defines.GetOrCreateValue(Name); 408 entry.setValue(1); 409 410 // fill information structure 411 NameAndAttributes info; 412 StringRef NameRef = entry.getKey(); 413 info.name = NameRef.data(); 414 assert(info.name[NameRef.size()] == '\0'); 415 info.attributes = attr; 416 info.isFunction = isFunction; 417 info.symbol = def; 418 419 // add to table of symbols 420 _symbols.push_back(info); 421 } 422 423 /// addAsmGlobalSymbol - Add a global symbol from module-level ASM to the 424 /// defined list. 425 void LTOModule::addAsmGlobalSymbol(const char *name, 426 lto_symbol_attributes scope) { 427 StringSet::value_type &entry = _defines.GetOrCreateValue(name); 428 429 // only add new define if not already defined 430 if (entry.getValue()) 431 return; 432 433 entry.setValue(1); 434 435 NameAndAttributes &info = _undefines[entry.getKey().data()]; 436 437 if (info.symbol == nullptr) { 438 // FIXME: This is trying to take care of module ASM like this: 439 // 440 // module asm ".zerofill __FOO, __foo, _bar_baz_qux, 0" 441 // 442 // but is gross and its mother dresses it funny. Have the ASM parser give us 443 // more details for this type of situation so that we're not guessing so 444 // much. 445 446 // fill information structure 447 info.name = entry.getKey().data(); 448 info.attributes = 449 LTO_SYMBOL_PERMISSIONS_DATA | LTO_SYMBOL_DEFINITION_REGULAR | scope; 450 info.isFunction = false; 451 info.symbol = nullptr; 452 453 // add to table of symbols 454 _symbols.push_back(info); 455 return; 456 } 457 458 if (info.isFunction) 459 addDefinedFunctionSymbol(info.name, cast<Function>(info.symbol)); 460 else 461 addDefinedDataSymbol(info.name, info.symbol); 462 463 _symbols.back().attributes &= ~LTO_SYMBOL_SCOPE_MASK; 464 _symbols.back().attributes |= scope; 465 } 466 467 /// addAsmGlobalSymbolUndef - Add a global symbol from module-level ASM to the 468 /// undefined list. 469 void LTOModule::addAsmGlobalSymbolUndef(const char *name) { 470 StringMap<NameAndAttributes>::value_type &entry = 471 _undefines.GetOrCreateValue(name); 472 473 _asm_undefines.push_back(entry.getKey().data()); 474 475 // we already have the symbol 476 if (entry.getValue().name) 477 return; 478 479 uint32_t attr = LTO_SYMBOL_DEFINITION_UNDEFINED; 480 attr |= LTO_SYMBOL_SCOPE_DEFAULT; 481 NameAndAttributes info; 482 info.name = entry.getKey().data(); 483 info.attributes = attr; 484 info.isFunction = false; 485 info.symbol = nullptr; 486 487 entry.setValue(info); 488 } 489 490 /// Add a symbol which isn't defined just yet to a list to be resolved later. 491 void LTOModule::addPotentialUndefinedSymbol(const object::BasicSymbolRef &Sym, 492 bool isFunc) { 493 SmallString<64> name; 494 { 495 raw_svector_ostream OS(name); 496 Sym.printName(OS); 497 } 498 499 StringMap<NameAndAttributes>::value_type &entry = 500 _undefines.GetOrCreateValue(name); 501 502 // we already have the symbol 503 if (entry.getValue().name) 504 return; 505 506 NameAndAttributes info; 507 508 info.name = entry.getKey().data(); 509 510 const GlobalValue *decl = IRFile->getSymbolGV(Sym.getRawDataRefImpl()); 511 512 if (decl->hasExternalWeakLinkage()) 513 info.attributes = LTO_SYMBOL_DEFINITION_WEAKUNDEF; 514 else 515 info.attributes = LTO_SYMBOL_DEFINITION_UNDEFINED; 516 517 info.isFunction = isFunc; 518 info.symbol = decl; 519 520 entry.setValue(info); 521 } 522 523 /// parseSymbols - Parse the symbols from the module and model-level ASM and add 524 /// them to either the defined or undefined lists. 525 bool LTOModule::parseSymbols(std::string &errMsg) { 526 for (auto &Sym : IRFile->symbols()) { 527 const GlobalValue *GV = IRFile->getSymbolGV(Sym.getRawDataRefImpl()); 528 uint32_t Flags = Sym.getFlags(); 529 if (Flags & object::BasicSymbolRef::SF_FormatSpecific) 530 continue; 531 532 bool IsUndefined = Flags & object::BasicSymbolRef::SF_Undefined; 533 534 if (!GV) { 535 SmallString<64> Buffer; 536 { 537 raw_svector_ostream OS(Buffer); 538 Sym.printName(OS); 539 } 540 const char *Name = Buffer.c_str(); 541 542 if (IsUndefined) 543 addAsmGlobalSymbolUndef(Name); 544 else if (Flags & object::BasicSymbolRef::SF_Global) 545 addAsmGlobalSymbol(Name, LTO_SYMBOL_SCOPE_DEFAULT); 546 else 547 addAsmGlobalSymbol(Name, LTO_SYMBOL_SCOPE_INTERNAL); 548 continue; 549 } 550 551 auto *F = dyn_cast<Function>(GV); 552 if (IsUndefined) { 553 addPotentialUndefinedSymbol(Sym, F != nullptr); 554 continue; 555 } 556 557 if (F) { 558 addDefinedFunctionSymbol(Sym); 559 continue; 560 } 561 562 if (isa<GlobalVariable>(GV)) { 563 addDefinedDataSymbol(Sym); 564 continue; 565 } 566 567 assert(isa<GlobalAlias>(GV)); 568 addDefinedDataSymbol(Sym); 569 } 570 571 // make symbols for all undefines 572 for (StringMap<NameAndAttributes>::iterator u =_undefines.begin(), 573 e = _undefines.end(); u != e; ++u) { 574 // If this symbol also has a definition, then don't make an undefine because 575 // it is a tentative definition. 576 if (_defines.count(u->getKey())) continue; 577 NameAndAttributes info = u->getValue(); 578 _symbols.push_back(info); 579 } 580 581 return false; 582 } 583 584 /// parseMetadata - Parse metadata from the module 585 void LTOModule::parseMetadata() { 586 // Linker Options 587 if (Value *Val = getModule().getModuleFlag("Linker Options")) { 588 MDNode *LinkerOptions = cast<MDNode>(Val); 589 for (unsigned i = 0, e = LinkerOptions->getNumOperands(); i != e; ++i) { 590 MDNode *MDOptions = cast<MDNode>(LinkerOptions->getOperand(i)); 591 for (unsigned ii = 0, ie = MDOptions->getNumOperands(); ii != ie; ++ii) { 592 MDString *MDOption = cast<MDString>(MDOptions->getOperand(ii)); 593 StringRef Op = _linkeropt_strings. 594 GetOrCreateValue(MDOption->getString()).getKey(); 595 StringRef DepLibName = _target->getSubtargetImpl() 596 ->getTargetLowering() 597 ->getObjFileLowering() 598 .getDepLibFromLinkerOpt(Op); 599 if (!DepLibName.empty()) 600 _deplibs.push_back(DepLibName.data()); 601 else if (!Op.empty()) 602 _linkeropts.push_back(Op.data()); 603 } 604 } 605 } 606 607 // Add other interesting metadata here. 608 } 609