Index: lib/LTO/LTOBackend.cpp =================================================================== --- lib/LTO/LTOBackend.cpp +++ lib/LTO/LTOBackend.cpp @@ -21,6 +21,7 @@ #include "llvm/IR/LegacyPassManager.h" #include "llvm/LTO/LTO.h" #include "llvm/MC/SubtargetFeature.h" +#include "llvm/Support/CommandLine.h" #include "llvm/Support/Error.h" #include "llvm/Support/FileSystem.h" #include "llvm/Support/TargetRegistry.h" @@ -34,6 +35,18 @@ using namespace llvm; using namespace lto; +static cl::opt +FLTOAsmFilename("flto-asm-file", + cl::desc("Assembly file name to print assembly code after " + "LTO phase. Works only with flto-print-asm enabled."), + cl::Hidden); + +static cl::opt +FLTOPrintAsm("flto-print-asm", + cl::desc("Print assembly file in after LTO phase"), + cl::init(false), cl::Hidden); + + Error Config::addSaveTemps(std::string OutputFileName, bool UseInputModulePath) { ShouldDiscardValueNames = false; @@ -156,6 +169,34 @@ }; } +// Generates assembly file with -Wl,-plugin-opt=-flto-print-asm +void genAssemblyFile(TargetMachine *TM, Module &M){ + int FD; + std::error_code EC; + SmallString<32> OutputFile; + + if(FLTOAsmFilename == ""){ + EC = sys::fs::createTemporaryFile("llvm-flto", "s", FD, OutputFile); + errs() << "Wrtiting to file : " << OutputFile << "\n"; + }else{ + EC = sys::fs::openFileForWrite(StringRef(FLTOAsmFilename), + FD, sys::fs::F_None); + } + + if (EC) + report_fatal_error( "Could not open file: %s", EC.message().c_str()); + + std::unique_ptr + AsmStream = llvm::make_unique(FD, true); + + legacy::PassManager CodeGenPasses; + + if (TM->addPassesToEmitFile(CodeGenPasses, *AsmStream, + TargetMachine::CGFT_AssemblyFile)) + report_fatal_error("Failed to setup assembly gen in codegen"); + + CodeGenPasses.run(M); +} void codegen(Config &C, TargetMachine *TM, AddOutputFn AddOutput, unsigned Task, Module &M) { if (C.PreCodeGenModuleHook && !C.PreCodeGenModuleHook(Task, M)) @@ -164,6 +205,12 @@ auto Output = AddOutput(Task); std::unique_ptr OS = Output->getStream(); legacy::PassManager CodeGenPasses; + + // Generate assembly file + if(FLTOPrintAsm){ + genAssemblyFile(TM, M); + } + if (TM->addPassesToEmitFile(CodeGenPasses, *OS, TargetMachine::CGFT_ObjectFile)) report_fatal_error("Failed to setup codegen");