Compiler.cpp revision 2558ae40f4614f119a3bccfe3c2d753d83f3593e
1/* 2 * Copyright 2010, The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#include "Compiler.h" 18 19#include "Config.h" 20 21#if USE_OLD_JIT 22#include "OldJIT/ContextManager.h" 23#endif 24 25#if USE_DISASSEMBLER 26#include "Disassembler/Disassembler.h" 27#endif 28 29#include "DebugHelper.h" 30#include "FileHandle.h" 31#include "Runtime.h" 32#include "ScriptCompiled.h" 33#include "Sha1Helper.h" 34 35#if USE_MCJIT 36#include "librsloader.h" 37#endif 38 39#include "llvm/ADT/StringRef.h" 40 41#include "llvm/Analysis/Passes.h" 42 43#include "llvm/Bitcode/ReaderWriter.h" 44 45#include "llvm/CodeGen/Passes.h" 46#include "llvm/CodeGen/RegAllocRegistry.h" 47#include "llvm/CodeGen/SchedulerRegistry.h" 48 49#include "llvm/MC/SubtargetFeature.h" 50 51#include "llvm/Transforms/IPO.h" 52#include "llvm/Transforms/Scalar.h" 53 54#include "llvm/Target/TargetData.h" 55#include "llvm/Target/TargetMachine.h" 56#include "llvm/Target/TargetOptions.h" 57#include "llvm/Target/TargetRegistry.h" 58#include "llvm/Target/TargetSelect.h" 59 60#include "llvm/Support/ErrorHandling.h" 61#include "llvm/Support/FormattedStream.h" 62#include "llvm/Support/MemoryBuffer.h" 63 64#include "llvm/Type.h" 65#include "llvm/GlobalValue.h" 66#include "llvm/Linker.h" 67#include "llvm/LLVMContext.h" 68#include "llvm/Metadata.h" 69#include "llvm/Module.h" 70#include "llvm/PassManager.h" 71#include "llvm/Value.h" 72 73#include <errno.h> 74#include <sys/file.h> 75#include <sys/stat.h> 76#include <sys/types.h> 77#include <unistd.h> 78 79#include <string.h> 80 81#include <algorithm> 82#include <iterator> 83#include <string> 84#include <vector> 85 86namespace bcc { 87 88////////////////////////////////////////////////////////////////////////////// 89// BCC Compiler Static Variables 90////////////////////////////////////////////////////////////////////////////// 91 92bool Compiler::GlobalInitialized = false; 93 94// Code generation optimization level for the compiler 95llvm::CodeGenOpt::Level Compiler::CodeGenOptLevel; 96 97std::string Compiler::Triple; 98 99std::string Compiler::CPU; 100 101std::vector<std::string> Compiler::Features; 102 103// Name of metadata node where pragma info resides (should be synced with 104// slang.cpp) 105const llvm::StringRef Compiler::PragmaMetadataName = "#pragma"; 106 107// Name of metadata node where exported variable names reside (should be 108// synced with slang_rs_metadata.h) 109const llvm::StringRef Compiler::ExportVarMetadataName = "#rs_export_var"; 110 111// Name of metadata node where exported function names reside (should be 112// synced with slang_rs_metadata.h) 113const llvm::StringRef Compiler::ExportFuncMetadataName = "#rs_export_func"; 114 115// Name of metadata node where RS object slot info resides (should be 116// synced with slang_rs_metadata.h) 117const llvm::StringRef Compiler::ObjectSlotMetadataName = "#rs_object_slots"; 118 119////////////////////////////////////////////////////////////////////////////// 120// Compiler 121////////////////////////////////////////////////////////////////////////////// 122 123void Compiler::GlobalInitialization() { 124 if (GlobalInitialized) 125 return; 126 // if (!llvm::llvm_is_multithreaded()) 127 // llvm::llvm_start_multithreaded(); 128 129 // Set Triple, CPU and Features here 130 Triple = TARGET_TRIPLE_STRING; 131 132 Features.push_back("+vfp3"); 133 134 // NOTE: Currently, we have to turn off the support for NEON explicitly. 135 // Since the ARMCodeEmitter.cpp is not ready for JITing NEON 136 // instructions. 137#if ARCH_ARM_HAVE_NEON 138 Features.push_back("+d32"); 139 Features.push_back("+neon"); 140 Features.push_back("+neonfp"); 141#else 142 Features.push_back("+d16"); 143 Features.push_back("-neon"); 144 Features.push_back("-neonfp"); 145#endif 146 147 Features.push_back("-vmlx"); 148 149#if defined(DEFAULT_ARM_CODEGEN) || defined(PROVIDE_ARM_CODEGEN) 150 LLVMInitializeARMMCAsmInfo(); 151 LLVMInitializeARMMCCodeGenInfo(); 152 LLVMInitializeARMMCSubtargetInfo(); 153 LLVMInitializeARMAsmPrinter(); 154 LLVMInitializeARMTargetInfo(); 155 LLVMInitializeARMTarget(); 156#endif 157 158#if defined(DEFAULT_X86_CODEGEN) || defined(PROVIDE_X86_CODEGEN) || \ 159 defined(DEFAULT_X64_CODEGEN) || defined(PROVIDE_X64_CODEGEN) 160 LLVMInitializeX86MCAsmInfo(); 161 LLVMInitializeX86MCCodeGenInfo(); 162 LLVMInitializeX86MCSubtargetInfo(); 163 LLVMInitializeX86AsmPrinter(); 164 LLVMInitializeX86TargetInfo(); 165 LLVMInitializeX86Target(); 166#endif 167 168#if USE_DISASSEMBLER 169 InitializeDisassembler(); 170#endif 171 172 // -O0: llvm::CodeGenOpt::None 173 // -O1: llvm::CodeGenOpt::Less 174 // -O2: llvm::CodeGenOpt::Default 175 // -O3: llvm::CodeGenOpt::Aggressive 176 CodeGenOptLevel = llvm::CodeGenOpt::Aggressive; 177 178 // Below are the global settings to LLVM 179 180 // Disable frame pointer elimination optimization 181 llvm::NoFramePointerElim = false; 182 183 // Use hardfloat ABI 184 // 185 // TODO(all): Need to detect the CPU capability and decide whether to use 186 // softfp. To use softfp, change following 2 lines to 187 // 188 // llvm::FloatABIType = llvm::FloatABI::Soft; 189 // llvm::UseSoftFloat = true; 190 // 191 llvm::FloatABIType = llvm::FloatABI::Soft; 192 llvm::UseSoftFloat = false; 193 194#if defined(DEFAULT_X64_CODEGEN) 195 // Data address in X86_64 architecture may reside in a far-away place 196 llvm::TargetMachine::setCodeModel(llvm::CodeModel::Medium); 197#else 198 // This is set for the linker (specify how large of the virtual addresses 199 // we can access for all unknown symbols.) 200 llvm::TargetMachine::setCodeModel(llvm::CodeModel::Small); 201#endif 202 203 // Register the scheduler 204 llvm::RegisterScheduler::setDefault(llvm::createDefaultScheduler); 205 206 // Register allocation policy: 207 // createFastRegisterAllocator: fast but bad quality 208 // createLinearScanRegisterAllocator: not so fast but good quality 209 llvm::RegisterRegAlloc::setDefault 210 ((CodeGenOptLevel == llvm::CodeGenOpt::None) ? 211 llvm::createFastRegisterAllocator : 212 llvm::createLinearScanRegisterAllocator); 213 214#if USE_CACHE 215 // Read in SHA1 checksum of libbcc and libRS. 216 readSHA1(sha1LibBCC_SHA1, sizeof(sha1LibBCC_SHA1), pathLibBCC_SHA1); 217 218 calcFileSHA1(sha1LibRS, pathLibRS); 219#endif 220 221 GlobalInitialized = true; 222} 223 224 225void Compiler::LLVMErrorHandler(void *UserData, const std::string &Message) { 226 std::string *Error = static_cast<std::string*>(UserData); 227 Error->assign(Message); 228 LOGE("%s", Message.c_str()); 229 exit(1); 230} 231 232 233#if USE_OLD_JIT 234CodeMemoryManager *Compiler::createCodeMemoryManager() { 235 mCodeMemMgr.reset(new CodeMemoryManager()); 236 return mCodeMemMgr.get(); 237} 238#endif 239 240 241#if USE_OLD_JIT 242CodeEmitter *Compiler::createCodeEmitter() { 243 mCodeEmitter.reset(new CodeEmitter(mpResult, mCodeMemMgr.get())); 244 return mCodeEmitter.get(); 245} 246#endif 247 248 249Compiler::Compiler(ScriptCompiled *result) 250 : mpResult(result), 251#if USE_MCJIT 252 mRSExecutable(NULL), 253#endif 254 mpSymbolLookupFn(NULL), 255 mpSymbolLookupContext(NULL), 256 mContext(NULL), 257 mModule(NULL), 258 mHasLinked(false) /* Turn off linker */ { 259 llvm::remove_fatal_error_handler(); 260 llvm::install_fatal_error_handler(LLVMErrorHandler, &mError); 261 mContext = new llvm::LLVMContext(); 262 return; 263} 264 265 266llvm::Module *Compiler::parseBitcodeFile(llvm::MemoryBuffer *MEM) { 267 llvm::Module *result = llvm::ParseBitcodeFile(MEM, *mContext, &mError); 268 269 if (!result) { 270 LOGE("Unable to ParseBitcodeFile: %s\n", mError.c_str()); 271 return NULL; 272 } 273 274 return result; 275} 276 277 278int Compiler::linkModule(llvm::Module *moduleWith) { 279 if (llvm::Linker::LinkModules(mModule, moduleWith, &mError) != 0) { 280 return hasError(); 281 } 282 283 // Everything for linking should be settled down here with no error occurs 284 mHasLinked = true; 285 return hasError(); 286} 287 288 289int Compiler::compile(bool compileOnly) { 290 llvm::Target const *Target = NULL; 291 llvm::TargetData *TD = NULL; 292 llvm::TargetMachine *TM = NULL; 293 294 std::string FeaturesStr; 295 296 llvm::NamedMDNode const *PragmaMetadata; 297 llvm::NamedMDNode const *ExportVarMetadata; 298 llvm::NamedMDNode const *ExportFuncMetadata; 299 llvm::NamedMDNode const *ObjectSlotMetadata; 300 301 if (mModule == NULL) // No module was loaded 302 return 0; 303 304 // Create TargetMachine 305 Target = llvm::TargetRegistry::lookupTarget(Triple, mError); 306 if (hasError()) 307 goto on_bcc_compile_error; 308 309 if (!CPU.empty() || !Features.empty()) { 310 llvm::SubtargetFeatures F; 311 312 for (std::vector<std::string>::const_iterator 313 I = Features.begin(), E = Features.end(); I != E; I++) { 314 F.AddFeature(*I); 315 } 316 317 FeaturesStr = F.getString(); 318 } 319 320 TM = Target->createTargetMachine(Triple, CPU, FeaturesStr, 321 llvm::Reloc::Static); 322 if (TM == NULL) { 323 setError("Failed to create target machine implementation for the" 324 " specified triple '" + Triple + "'"); 325 goto on_bcc_compile_error; 326 } 327 328 // Get target data from Module 329 TD = new llvm::TargetData(mModule); 330 331 // Load named metadata 332 ExportVarMetadata = mModule->getNamedMetadata(ExportVarMetadataName); 333 ExportFuncMetadata = mModule->getNamedMetadata(ExportFuncMetadataName); 334 PragmaMetadata = mModule->getNamedMetadata(PragmaMetadataName); 335 ObjectSlotMetadata = mModule->getNamedMetadata(ObjectSlotMetadataName); 336 337 // Perform link-time optimization if we have multiple modules 338 if (mHasLinked) { 339 runLTO(new llvm::TargetData(*TD), ExportVarMetadata, ExportFuncMetadata); 340 } 341 342 // Perform code generation 343#if USE_OLD_JIT 344 if (runCodeGen(new llvm::TargetData(*TD), TM, 345 ExportVarMetadata, ExportFuncMetadata) != 0) { 346 goto on_bcc_compile_error; 347 } 348#endif 349 350#if USE_MCJIT 351 if (runMCCodeGen(new llvm::TargetData(*TD), TM) != 0) { 352 goto on_bcc_compile_error; 353 } 354 355 if (compileOnly) 356 return 0; 357 358 // Load the ELF Object 359 mRSExecutable = 360 rsloaderCreateExec((unsigned char *)&*mEmittedELFExecutable.begin(), 361 mEmittedELFExecutable.size(), 362 &resolveSymbolAdapter, this); 363 364 if (!mRSExecutable) { 365 setError("Fail to load emitted ELF relocatable file"); 366 goto on_bcc_compile_error; 367 } 368 369 if (ExportVarMetadata) { 370 ScriptCompiled::ExportVarList &varList = mpResult->mExportVars; 371 std::vector<std::string> &varNameList = mpResult->mExportVarsName; 372 373 for (int i = 0, e = ExportVarMetadata->getNumOperands(); i != e; i++) { 374 llvm::MDNode *ExportVar = ExportVarMetadata->getOperand(i); 375 if (ExportVar != NULL && ExportVar->getNumOperands() > 1) { 376 llvm::Value *ExportVarNameMDS = ExportVar->getOperand(0); 377 if (ExportVarNameMDS->getValueID() == llvm::Value::MDStringVal) { 378 llvm::StringRef ExportVarName = 379 static_cast<llvm::MDString*>(ExportVarNameMDS)->getString(); 380 381 varList.push_back( 382 rsloaderGetSymbolAddress(mRSExecutable, 383 ExportVarName.str().c_str())); 384 varNameList.push_back(ExportVarName.str()); 385#if DEBUG_MCJIT_REFLECT 386 LOGD("runMCCodeGen(): Exported Var: %s @ %p\n", ExportVarName.str().c_str(), 387 varList.back()); 388#endif 389 continue; 390 } 391 } 392 393 varList.push_back(NULL); 394 } 395 } 396 397 if (ExportFuncMetadata) { 398 ScriptCompiled::ExportFuncList &funcList = mpResult->mExportFuncs; 399 std::vector<std::string> &funcNameList = mpResult->mExportFuncsName; 400 401 for (int i = 0, e = ExportFuncMetadata->getNumOperands(); i != e; i++) { 402 llvm::MDNode *ExportFunc = ExportFuncMetadata->getOperand(i); 403 if (ExportFunc != NULL && ExportFunc->getNumOperands() > 0) { 404 llvm::Value *ExportFuncNameMDS = ExportFunc->getOperand(0); 405 if (ExportFuncNameMDS->getValueID() == llvm::Value::MDStringVal) { 406 llvm::StringRef ExportFuncName = 407 static_cast<llvm::MDString*>(ExportFuncNameMDS)->getString(); 408 409 funcList.push_back( 410 rsloaderGetSymbolAddress(mRSExecutable, 411 ExportFuncName.str().c_str())); 412 funcNameList.push_back(ExportFuncName.str()); 413#if DEBUG_MCJIT_RELECT 414 LOGD("runMCCodeGen(): Exported Func: %s @ %p\n", ExportFuncName.str().c_str(), 415 funcList.back()); 416#endif 417 } 418 } 419 } 420 } 421 422#if DEBUG_MCJIT_DISASSEMBLER 423 { 424 // Get MC codegen emitted function name list 425 size_t func_list_size = rsloaderGetFuncCount(mRSExecutable); 426 std::vector<char const *> func_list(func_list_size, NULL); 427 rsloaderGetFuncNameList(mRSExecutable, func_list_size, &*func_list.begin()); 428 429 // Disassemble each function 430 for (size_t i = 0; i < func_list_size; ++i) { 431 void *func = rsloaderGetSymbolAddress(mRSExecutable, func_list[i]); 432 if (func) { 433 size_t size = rsloaderGetSymbolSize(mRSExecutable, func_list[i]); 434 Disassemble(DEBUG_MCJIT_DISASSEMBLER_FILE, 435 Target, TM, func_list[i], (unsigned char const *)func, size); 436 } 437 } 438 } 439#endif 440#endif 441 442 // Read pragma information from the metadata node of the module. 443 if (PragmaMetadata) { 444 ScriptCompiled::PragmaList &pragmaList = mpResult->mPragmas; 445 446 for (int i = 0, e = PragmaMetadata->getNumOperands(); i != e; i++) { 447 llvm::MDNode *Pragma = PragmaMetadata->getOperand(i); 448 if (Pragma != NULL && 449 Pragma->getNumOperands() == 2 /* should have exactly 2 operands */) { 450 llvm::Value *PragmaNameMDS = Pragma->getOperand(0); 451 llvm::Value *PragmaValueMDS = Pragma->getOperand(1); 452 453 if ((PragmaNameMDS->getValueID() == llvm::Value::MDStringVal) && 454 (PragmaValueMDS->getValueID() == llvm::Value::MDStringVal)) { 455 llvm::StringRef PragmaName = 456 static_cast<llvm::MDString*>(PragmaNameMDS)->getString(); 457 llvm::StringRef PragmaValue = 458 static_cast<llvm::MDString*>(PragmaValueMDS)->getString(); 459 460 pragmaList.push_back( 461 std::make_pair(std::string(PragmaName.data(), 462 PragmaName.size()), 463 std::string(PragmaValue.data(), 464 PragmaValue.size()))); 465#if DEBUG_BCC_REFLECT 466 LOGD("compile(): Pragma: %s -> %s\n", 467 pragmaList.back().first.c_str(), 468 pragmaList.back().second.c_str()); 469#endif 470 } 471 } 472 } 473 } 474 475 if (ObjectSlotMetadata) { 476 ScriptCompiled::ObjectSlotList &objectSlotList = mpResult->mObjectSlots; 477 478 for (int i = 0, e = ObjectSlotMetadata->getNumOperands(); i != e; i++) { 479 llvm::MDNode *ObjectSlot = ObjectSlotMetadata->getOperand(i); 480 if (ObjectSlot != NULL && 481 ObjectSlot->getNumOperands() == 1) { 482 llvm::Value *SlotMDS = ObjectSlot->getOperand(0); 483 if (SlotMDS->getValueID() == llvm::Value::MDStringVal) { 484 llvm::StringRef Slot = 485 static_cast<llvm::MDString*>(SlotMDS)->getString(); 486 uint32_t USlot = 0; 487 if (Slot.getAsInteger(10, USlot)) { 488 setError("Non-integer object slot value '" + Slot.str() + "'"); 489 goto on_bcc_compile_error; 490 } 491 objectSlotList.push_back(USlot); 492#if DEBUG_BCC_REFLECT 493 LOGD("compile(): RefCount Slot: %s @ %u\n", Slot.str().c_str(), USlot); 494#endif 495 } 496 } 497 } 498 } 499 500on_bcc_compile_error: 501 // LOGE("on_bcc_compiler_error"); 502 if (TD) { 503 delete TD; 504 } 505 506 if (TM) { 507 delete TM; 508 } 509 510 if (mError.empty()) { 511 return 0; 512 } 513 514 // LOGE(getErrorMessage()); 515 return 1; 516} 517 518 519#if USE_OLD_JIT 520int Compiler::runCodeGen(llvm::TargetData *TD, llvm::TargetMachine *TM, 521 llvm::NamedMDNode const *ExportVarMetadata, 522 llvm::NamedMDNode const *ExportFuncMetadata) { 523 // Create memory manager for creation of code emitter later. 524 if (!mCodeMemMgr.get() && !createCodeMemoryManager()) { 525 setError("Failed to startup memory management for further compilation"); 526 return 1; 527 } 528 529 mpResult->mContext = (char *) (mCodeMemMgr.get()->getCodeMemBase()); 530 531 // Create code emitter 532 if (!mCodeEmitter.get()) { 533 if (!createCodeEmitter()) { 534 setError("Failed to create machine code emitter for compilation"); 535 return 1; 536 } 537 } else { 538 // Reuse the code emitter 539 mCodeEmitter->reset(); 540 } 541 542 mCodeEmitter->setTargetMachine(*TM); 543 mCodeEmitter->registerSymbolCallback(mpSymbolLookupFn, 544 mpSymbolLookupContext); 545 546 // Create code-gen pass to run the code emitter 547 llvm::OwningPtr<llvm::FunctionPassManager> CodeGenPasses( 548 new llvm::FunctionPassManager(mModule)); 549 550 // Add TargetData to code generation pass manager 551 CodeGenPasses->add(TD); 552 553 // Add code emit passes 554 if (TM->addPassesToEmitMachineCode(*CodeGenPasses, 555 *mCodeEmitter, 556 CodeGenOptLevel)) { 557 setError("The machine code emission is not supported on '" + Triple + "'"); 558 return 1; 559 } 560 561 // Run the code emitter on every non-declaration function in the module 562 CodeGenPasses->doInitialization(); 563 for (llvm::Module::iterator 564 I = mModule->begin(), E = mModule->end(); I != E; I++) { 565 if (!I->isDeclaration()) { 566 CodeGenPasses->run(*I); 567 } 568 } 569 570 CodeGenPasses->doFinalization(); 571 572 // Copy the global address mapping from code emitter and remapping 573 if (ExportVarMetadata) { 574 ScriptCompiled::ExportVarList &varList = mpResult->mExportVars; 575 576 for (int i = 0, e = ExportVarMetadata->getNumOperands(); i != e; i++) { 577 llvm::MDNode *ExportVar = ExportVarMetadata->getOperand(i); 578 if (ExportVar != NULL && ExportVar->getNumOperands() > 1) { 579 llvm::Value *ExportVarNameMDS = ExportVar->getOperand(0); 580 if (ExportVarNameMDS->getValueID() == llvm::Value::MDStringVal) { 581 llvm::StringRef ExportVarName = 582 static_cast<llvm::MDString*>(ExportVarNameMDS)->getString(); 583 584 CodeEmitter::global_addresses_const_iterator I, E; 585 for (I = mCodeEmitter->global_address_begin(), 586 E = mCodeEmitter->global_address_end(); 587 I != E; I++) { 588 if (I->first->getValueID() != llvm::Value::GlobalVariableVal) 589 continue; 590 if (ExportVarName == I->first->getName()) { 591 varList.push_back(I->second); 592#if DEBUG_BCC_REFLECT 593 LOGD("runCodeGen(): Exported VAR: %s @ %p\n", ExportVarName.str().c_str(), I->second); 594#endif 595 break; 596 } 597 } 598 if (I != mCodeEmitter->global_address_end()) 599 continue; // found 600 601#if DEBUG_BCC_REFLECT 602 LOGD("runCodeGen(): Exported VAR: %s @ %p\n", 603 ExportVarName.str().c_str(), (void *)0); 604#endif 605 } 606 } 607 // if reaching here, we know the global variable record in metadata is 608 // not found. So we make an empty slot 609 varList.push_back(NULL); 610 } 611 612 bccAssert((varList.size() == ExportVarMetadata->getNumOperands()) && 613 "Number of slots doesn't match the number of export variables!"); 614 } 615 616 if (ExportFuncMetadata) { 617 ScriptCompiled::ExportFuncList &funcList = mpResult->mExportFuncs; 618 619 for (int i = 0, e = ExportFuncMetadata->getNumOperands(); i != e; i++) { 620 llvm::MDNode *ExportFunc = ExportFuncMetadata->getOperand(i); 621 if (ExportFunc != NULL && ExportFunc->getNumOperands() > 0) { 622 llvm::Value *ExportFuncNameMDS = ExportFunc->getOperand(0); 623 if (ExportFuncNameMDS->getValueID() == llvm::Value::MDStringVal) { 624 llvm::StringRef ExportFuncName = 625 static_cast<llvm::MDString*>(ExportFuncNameMDS)->getString(); 626 funcList.push_back(mpResult->lookup(ExportFuncName.str().c_str())); 627#if DEBUG_BCC_REFLECT 628 LOGD("runCodeGen(): Exported Func: %s @ %p\n", ExportFuncName.str().c_str(), 629 funcList.back()); 630#endif 631 } 632 } 633 } 634 } 635 636 // Tell code emitter now can release the memory using during the JIT since 637 // we have done the code emission 638 mCodeEmitter->releaseUnnecessary(); 639 640 return 0; 641} 642#endif // USE_OLD_JIT 643 644 645#if USE_MCJIT 646int Compiler::runMCCodeGen(llvm::TargetData *TD, llvm::TargetMachine *TM) { 647 // Decorate mEmittedELFExecutable with formatted ostream 648 llvm::raw_svector_ostream OutSVOS(mEmittedELFExecutable); 649 650 // Relax all machine instructions 651 TM->setMCRelaxAll(/* RelaxAll= */ true); 652 653 // Create MC code generation pass manager 654 llvm::PassManager MCCodeGenPasses; 655 656 // Add TargetData to MC code generation pass manager 657 MCCodeGenPasses.add(TD); 658 659 // Add MC code generation passes to pass manager 660 llvm::MCContext *Ctx; 661 if (TM->addPassesToEmitMC(MCCodeGenPasses, Ctx, OutSVOS, 662 CodeGenOptLevel, false)) { 663 setError("Fail to add passes to emit file"); 664 return 1; 665 } 666 667 MCCodeGenPasses.run(*mModule); 668 OutSVOS.flush(); 669 return 0; 670} 671#endif // USE_MCJIT 672 673 674int Compiler::runLTO(llvm::TargetData *TD, 675 llvm::NamedMDNode const *ExportVarMetadata, 676 llvm::NamedMDNode const *ExportFuncMetadata) { 677 llvm::PassManager LTOPasses; 678 679 // Add TargetData to LTO passes 680 LTOPasses.add(TD); 681 682 // Collect All Exported Symbols 683 std::vector<const char*> ExportSymbols; 684 685 // Note: This is a workaround for getting export variable and function name. 686 // We should refine it soon. 687 if (ExportVarMetadata) { 688 for (int i = 0, e = ExportVarMetadata->getNumOperands(); i != e; i++) { 689 llvm::MDNode *ExportVar = ExportVarMetadata->getOperand(i); 690 if (ExportVar != NULL && ExportVar->getNumOperands() > 1) { 691 llvm::Value *ExportVarNameMDS = ExportVar->getOperand(0); 692 if (ExportVarNameMDS->getValueID() == llvm::Value::MDStringVal) { 693 llvm::StringRef ExportVarName = 694 static_cast<llvm::MDString*>(ExportVarNameMDS)->getString(); 695 ExportSymbols.push_back(ExportVarName.data()); 696 } 697 } 698 } 699 } 700 701 if (ExportFuncMetadata) { 702 for (int i = 0, e = ExportFuncMetadata->getNumOperands(); i != e; i++) { 703 llvm::MDNode *ExportFunc = ExportFuncMetadata->getOperand(i); 704 if (ExportFunc != NULL && ExportFunc->getNumOperands() > 0) { 705 llvm::Value *ExportFuncNameMDS = ExportFunc->getOperand(0); 706 if (ExportFuncNameMDS->getValueID() == llvm::Value::MDStringVal) { 707 llvm::StringRef ExportFuncName = 708 static_cast<llvm::MDString*>(ExportFuncNameMDS)->getString(); 709 ExportSymbols.push_back(ExportFuncName.data()); 710 } 711 } 712 } 713 } 714 715 // TODO(logan): Remove this after we have finished the 716 // bccMarkExternalSymbol API. 717 718 // root() and init() are born to be exported 719 ExportSymbols.push_back("root"); 720 ExportSymbols.push_back("init"); 721 722 // User-defined exporting symbols 723 std::vector<char const *> const &UserDefinedExternalSymbols = 724 mpResult->getUserDefinedExternalSymbols(); 725 726 std::copy(UserDefinedExternalSymbols.begin(), 727 UserDefinedExternalSymbols.end(), 728 std::back_inserter(ExportSymbols)); 729 730 // We now create passes list performing LTO. These are copied from 731 // (including comments) llvm::createStandardLTOPasses(). 732 733 // Internalize all other symbols not listed in ExportSymbols 734 LTOPasses.add(llvm::createInternalizePass(ExportSymbols)); 735 736 // Propagate constants at call sites into the functions they call. This 737 // opens opportunities for globalopt (and inlining) by substituting 738 // function pointers passed as arguments to direct uses of functions. 739 LTOPasses.add(llvm::createIPSCCPPass()); 740 741 // Now that we internalized some globals, see if we can hack on them! 742 LTOPasses.add(llvm::createGlobalOptimizerPass()); 743 744 // Linking modules together can lead to duplicated global constants, only 745 // keep one copy of each constant... 746 LTOPasses.add(llvm::createConstantMergePass()); 747 748 // Remove unused arguments from functions... 749 LTOPasses.add(llvm::createDeadArgEliminationPass()); 750 751 // Reduce the code after globalopt and ipsccp. Both can open up 752 // significant simplification opportunities, and both can propagate 753 // functions through function pointers. When this happens, we often have 754 // to resolve varargs calls, etc, so let instcombine do this. 755 LTOPasses.add(llvm::createInstructionCombiningPass()); 756 757 // Inline small functions 758 LTOPasses.add(llvm::createFunctionInliningPass()); 759 760 // Remove dead EH info. 761 LTOPasses.add(llvm::createPruneEHPass()); 762 763 // Internalize the globals again after inlining 764 LTOPasses.add(llvm::createGlobalOptimizerPass()); 765 766 // Remove dead functions. 767 LTOPasses.add(llvm::createGlobalDCEPass()); 768 769 // If we didn't decide to inline a function, check to see if we can 770 // transform it to pass arguments by value instead of by reference. 771 LTOPasses.add(llvm::createArgumentPromotionPass()); 772 773 // The IPO passes may leave cruft around. Clean up after them. 774 LTOPasses.add(llvm::createInstructionCombiningPass()); 775 LTOPasses.add(llvm::createJumpThreadingPass()); 776 777 // Break up allocas 778 LTOPasses.add(llvm::createScalarReplAggregatesPass()); 779 780 // Run a few AA driven optimizations here and now, to cleanup the code. 781 LTOPasses.add(llvm::createFunctionAttrsPass()); // Add nocapture. 782 LTOPasses.add(llvm::createGlobalsModRefPass()); // IP alias analysis. 783 784 // Hoist loop invariants. 785 LTOPasses.add(llvm::createLICMPass()); 786 787 // Remove redundancies. 788 LTOPasses.add(llvm::createGVNPass()); 789 790 // Remove dead memcpys. 791 LTOPasses.add(llvm::createMemCpyOptPass()); 792 793 // Nuke dead stores. 794 LTOPasses.add(llvm::createDeadStoreEliminationPass()); 795 796 // Cleanup and simplify the code after the scalar optimizations. 797 LTOPasses.add(llvm::createInstructionCombiningPass()); 798 799 LTOPasses.add(llvm::createJumpThreadingPass()); 800 801 // Delete basic blocks, which optimization passes may have killed. 802 LTOPasses.add(llvm::createCFGSimplificationPass()); 803 804 // Now that we have optimized the program, discard unreachable functions. 805 LTOPasses.add(llvm::createGlobalDCEPass()); 806 807 LTOPasses.run(*mModule); 808 809 return 0; 810} 811 812 813#if USE_MCJIT 814void *Compiler::getSymbolAddress(char const *name) { 815 return rsloaderGetSymbolAddress(mRSExecutable, name); 816} 817#endif 818 819 820#if USE_MCJIT 821void *Compiler::resolveSymbolAdapter(void *context, char const *name) { 822 Compiler *self = reinterpret_cast<Compiler *>(context); 823 824 if (void *Addr = FindRuntimeFunction(name)) { 825 return Addr; 826 } 827 828 if (self->mpSymbolLookupFn) { 829 if (void *Addr = self->mpSymbolLookupFn(self->mpSymbolLookupContext, name)) { 830 return Addr; 831 } 832 } 833 834 LOGE("Unable to resolve symbol: %s\n", name); 835 return NULL; 836} 837#endif 838 839 840Compiler::~Compiler() { 841 delete mModule; 842 delete mContext; 843 844#if USE_MCJIT 845 rsloaderDisposeExec(mRSExecutable); 846#endif 847 848 // llvm::llvm_shutdown(); 849} 850 851 852} // namespace bcc 853