#include "llvm/LTO/LTOCodeGenerator.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/Analysis/Passes.h"
+#include "llvm/Analysis/TargetLibraryInfo.h"
#include "llvm/Bitcode/ReaderWriter.h"
#include "llvm/CodeGen/RuntimeLibcalls.h"
#include "llvm/Config/config.h"
#include "llvm/Support/TargetSelect.h"
#include "llvm/Support/ToolOutputFile.h"
#include "llvm/Support/raw_ostream.h"
-#include "llvm/Target/TargetLibraryInfo.h"
#include "llvm/Target/TargetLowering.h"
#include "llvm/Target/TargetOptions.h"
#include "llvm/Target/TargetRegisterInfo.h"
}
LTOCodeGenerator::LTOCodeGenerator()
- : Context(getGlobalContext()), IRLinker(new Module("ld-temp.o", Context)),
- TargetMach(nullptr), EmitDwarfDebugInfo(false),
- ScopeRestrictionsDone(false), CodeModel(LTO_CODEGEN_PIC_MODEL_DEFAULT),
- NativeObjectFile(nullptr), DiagHandler(nullptr), DiagContext(nullptr) {
+ : Context(getGlobalContext()), IRLinker(new Module("ld-temp.o", Context)) {
+ initialize();
+}
+
+LTOCodeGenerator::LTOCodeGenerator(std::unique_ptr<LLVMContext> Context)
+ : OwnedContext(std::move(Context)), Context(*OwnedContext),
+ IRLinker(new Module("ld-temp.o", *OwnedContext)) {
+ initialize();
+}
+
+void LTOCodeGenerator::initialize() {
+ TargetMach = nullptr;
+ EmitDwarfDebugInfo = false;
+ ScopeRestrictionsDone = false;
+ CodeModel = LTO_CODEGEN_PIC_MODEL_DEFAULT;
+ DiagHandler = nullptr;
+ DiagContext = nullptr;
+
initializeLTOPasses();
}
LTOCodeGenerator::~LTOCodeGenerator() {
delete TargetMach;
- delete NativeObjectFile;
TargetMach = nullptr;
- NativeObjectFile = nullptr;
IRLinker.deleteModule();
initializeGlobalOptPass(R);
initializeConstantMergePass(R);
initializeDAHPass(R);
- initializeInstCombinerPass(R);
+ initializeInstructionCombiningPassPass(R);
initializeSimpleInlinerPass(R);
initializePruneEHPass(R);
initializeGlobalDCEPass(R);
initializeCFGSimplifyPassPass(R);
}
-bool LTOCodeGenerator::addModule(LTOModule* mod, std::string& errMsg) {
- bool ret = IRLinker.linkInModule(&mod->getModule(), &errMsg);
+bool LTOCodeGenerator::addModule(LTOModule *mod) {
+ assert(&mod->getModule().getContext() == &Context &&
+ "Expected module in same context");
+
+ bool ret = IRLinker.linkInModule(&mod->getModule());
const std::vector<const char*> &undefs = mod->getAsmUndefinedRefs();
for (int i = 0, e = undefs.size(); i != e; ++i)
applyScopeRestrictions();
// create output file
- std::string ErrInfo;
- tool_output_file Out(path, ErrInfo, sys::fs::F_None);
- if (!ErrInfo.empty()) {
+ std::error_code EC;
+ tool_output_file Out(path, EC, sys::fs::F_None);
+ if (EC) {
errMsg = "could not open bitcode file for writing: ";
errMsg += path;
return false;
bool disableOpt,
bool disableInline,
bool disableGVNLoadPRE,
+ bool disableVectorization,
std::string& errMsg) {
// make unique temp .o file to put generated object file
SmallString<128> Filename;
// generate object file
tool_output_file objFile(Filename.c_str(), FD);
- bool genResult = generateObjectFile(objFile.os(), disableOpt, disableInline,
- disableGVNLoadPRE, errMsg);
+ bool genResult =
+ generateObjectFile(objFile.os(), disableOpt, disableInline,
+ disableGVNLoadPRE, disableVectorization, errMsg);
objFile.os().close();
if (objFile.os().has_error()) {
objFile.os().clear_error();
bool disableOpt,
bool disableInline,
bool disableGVNLoadPRE,
+ bool disableVectorization,
std::string& errMsg) {
const char *name;
if (!compile_to_file(&name, disableOpt, disableInline, disableGVNLoadPRE,
- errMsg))
+ disableVectorization, errMsg))
return nullptr;
- // remove old buffer if compile() called twice
- delete NativeObjectFile;
-
// read .o file into memory buffer
ErrorOr<std::unique_ptr<MemoryBuffer>> BufferOrErr =
MemoryBuffer::getFile(name, -1, false);
sys::fs::remove(NativeObjectPath);
return nullptr;
}
- NativeObjectFile = BufferOrErr.get().release();
+ NativeObjectFile = std::move(*BufferOrErr);
// remove temp files
sys::fs::remove(NativeObjectPath);
void LTOCodeGenerator::
applyRestriction(GlobalValue &GV,
- const ArrayRef<StringRef> &Libcalls,
+ ArrayRef<StringRef> Libcalls,
std::vector<const char*> &MustPreserveList,
SmallPtrSetImpl<GlobalValue*> &AsmUsed,
Mangler &Mangler) {
std::vector<const char*> MustPreserveList;
SmallPtrSet<GlobalValue*, 8> AsmUsed;
std::vector<StringRef> Libcalls;
- TargetLibraryInfo TLI(Triple(TargetMach->getTargetTriple()));
+ TargetLibraryInfoImpl TLII(Triple(TargetMach->getTargetTriple()));
+ TargetLibraryInfo TLI(TLII);
accumulateAndSortLibcalls(
Libcalls, TLI, TargetMach->getSubtargetImpl()->getTargetLowering());
bool DisableOpt,
bool DisableInline,
bool DisableGVNLoadPRE,
+ bool DisableVectorization,
std::string &errMsg) {
if (!this->determineTarget(errMsg))
return false;
Triple TargetTriple(TargetMach->getTargetTriple());
PassManagerBuilder PMB;
PMB.DisableGVNLoadPRE = DisableGVNLoadPRE;
+ PMB.LoopVectorize = !DisableVectorization;
+ PMB.SLPVectorize = !DisableVectorization;
if (!DisableInline)
PMB.Inliner = createFunctionInliningPass();
- PMB.LibraryInfo = new TargetLibraryInfo(TargetTriple);
+ PMB.LibraryInfo = new TargetLibraryInfoImpl(TargetTriple);
if (DisableOpt)
PMB.OptLevel = 0;
PMB.VerifyInput = true;
PassManager codeGenPasses;
- codeGenPasses.add(new DataLayoutPass(mergedModule));
+ codeGenPasses.add(new DataLayoutPass());
formatted_raw_ostream Out(out);
return Context.setDiagnosticHandler(nullptr, nullptr);
// Register the LTOCodeGenerator stub in the LLVMContext to forward the
// diagnostic to the external DiagHandler.
- Context.setDiagnosticHandler(LTOCodeGenerator::DiagnosticHandler, this);
+ Context.setDiagnosticHandler(LTOCodeGenerator::DiagnosticHandler, this,
+ /* RespectFilters */ true);
}