summaryrefslogtreecommitdiff
path: root/tools/lto
diff options
context:
space:
mode:
authorRafael Espindola <rafael.espindola@gmail.com>2013-09-30 16:39:19 +0000
committerRafael Espindola <rafael.espindola@gmail.com>2013-09-30 16:39:19 +0000
commitc13c9e5a9d288eac494a38f0710d34446167f940 (patch)
tree9963870fcea50321766abe308393c6f996187897 /tools/lto
parent4b5205d2a3e0df909f29de0bff8ea775ad21fe0f (diff)
downloadllvm-c13c9e5a9d288eac494a38f0710d34446167f940.tar.gz
llvm-c13c9e5a9d288eac494a38f0710d34446167f940.tar.bz2
llvm-c13c9e5a9d288eac494a38f0710d34446167f940.tar.xz
Move command line options to the users of libLTO. Fixes --enable-shared build.
Patch by Richard Sandiford. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@191680 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools/lto')
-rw-r--r--tools/lto/lto.cpp67
1 files changed, 60 insertions, 7 deletions
diff --git a/tools/lto/lto.cpp b/tools/lto/lto.cpp
index 441bc77352..79967207f5 100644
--- a/tools/lto/lto.cpp
+++ b/tools/lto/lto.cpp
@@ -13,11 +13,24 @@
//===----------------------------------------------------------------------===//
#include "llvm-c/lto.h"
+#include "llvm/CodeGen/CommandFlags.h"
#include "llvm/LTO/LTOCodeGenerator.h"
#include "llvm/LTO/LTOModule.h"
#include "llvm-c/Core.h"
#include "llvm-c/Target.h"
+// extra command-line flags needed for LTOCodeGenerator
+static cl::opt<bool>
+DisableOpt("disable-opt", cl::init(false),
+ cl::desc("Do not run any optimization passes"));
+
+static cl::opt<bool>
+DisableInline("disable-inlining", cl::init(false),
+ cl::desc("Do not run the inliner pass"));
+
+static cl::opt<bool>
+DisableGVNLoadPRE("disable-gvn-loadpre", cl::init(false),
+ cl::desc("Do not run the GVN load PRE pass"));
// Holds most recent error string.
// *** Not thread safe ***
@@ -40,6 +53,28 @@ static void lto_initialize() {
}
}
+static void lto_set_target_options(llvm::TargetOptions &Options) {
+ Options.LessPreciseFPMADOption = EnableFPMAD;
+ Options.NoFramePointerElim = DisableFPElim;
+ Options.AllowFPOpFusion = FuseFPOps;
+ Options.UnsafeFPMath = EnableUnsafeFPMath;
+ Options.NoInfsFPMath = EnableNoInfsFPMath;
+ Options.NoNaNsFPMath = EnableNoNaNsFPMath;
+ Options.HonorSignDependentRoundingFPMathOption =
+ EnableHonorSignDependentRoundingFPMath;
+ Options.UseSoftFloat = GenerateSoftFloatCalls;
+ if (FloatABIForCalls != llvm::FloatABI::Default)
+ Options.FloatABIType = FloatABIForCalls;
+ Options.NoZerosInBSS = DontPlaceZerosInBSS;
+ Options.GuaranteedTailCallOpt = EnableGuaranteedTailCallOpt;
+ Options.DisableTailCalls = DisableTailCalls;
+ Options.StackAlignmentOverride = OverrideStackAlignment;
+ Options.TrapFuncName = TrapFuncName;
+ Options.PositionIndependentExecutable = EnablePIE;
+ Options.EnableSegmentedStacks = SegmentedStacks;
+ Options.UseInitArray = UseInitArray;
+}
+
/// lto_get_version - Returns a printable string.
extern const char* lto_get_version() {
return LTOCodeGenerator::getVersionString();
@@ -82,14 +117,18 @@ lto_module_is_object_file_in_memory_for_target(const void* mem,
/// (check lto_get_error_message() for details).
lto_module_t lto_module_create(const char* path) {
lto_initialize();
- return LTOModule::makeLTOModule(path, sLastErrorString);
+ llvm::TargetOptions Options;
+ lto_set_target_options(Options);
+ return LTOModule::makeLTOModule(path, Options, sLastErrorString);
}
/// lto_module_create_from_fd - Loads an object file from disk. Returns NULL on
/// error (check lto_get_error_message() for details).
lto_module_t lto_module_create_from_fd(int fd, const char *path, size_t size) {
lto_initialize();
- return LTOModule::makeLTOModule(fd, path, size, sLastErrorString);
+ llvm::TargetOptions Options;
+ lto_set_target_options(Options);
+ return LTOModule::makeLTOModule(fd, path, size, Options, sLastErrorString);
}
/// lto_module_create_from_fd_at_offset - Loads an object file from disk.
@@ -99,14 +138,19 @@ lto_module_t lto_module_create_from_fd_at_offset(int fd, const char *path,
size_t map_size,
off_t offset) {
lto_initialize();
- return LTOModule::makeLTOModule(fd, path, map_size, offset, sLastErrorString);
+ llvm::TargetOptions Options;
+ lto_set_target_options(Options);
+ return LTOModule::makeLTOModule(fd, path, map_size, offset, Options,
+ sLastErrorString);
}
/// lto_module_create_from_memory - Loads an object file from memory. Returns
/// NULL on error (check lto_get_error_message() for details).
lto_module_t lto_module_create_from_memory(const void* mem, size_t length) {
lto_initialize();
- return LTOModule::makeLTOModule(mem, length, sLastErrorString);
+ llvm::TargetOptions Options;
+ lto_set_target_options(Options);
+ return LTOModule::makeLTOModule(mem, length, Options, sLastErrorString);
}
/// lto_module_dispose - Frees all memory for a module. Upon return the
@@ -150,7 +194,14 @@ lto_symbol_attributes lto_module_get_symbol_attribute(lto_module_t mod,
/// is an error.
lto_code_gen_t lto_codegen_create(void) {
lto_initialize();
- return new LTOCodeGenerator();
+
+ TargetOptions Options;
+ lto_set_target_options(Options);
+
+ LTOCodeGenerator *CodeGen = new LTOCodeGenerator();
+ if (CodeGen)
+ CodeGen->setTargetOptions(Options);
+ return CodeGen;
}
/// lto_codegen_dispose - Frees all memory for a code generator. Upon return the
@@ -220,14 +271,16 @@ bool lto_codegen_write_merged_modules(lto_code_gen_t cg, const char *path) {
/// lto_codegen_compile() is called again. On failure, returns NULL (check
/// lto_get_error_message() for details).
const void *lto_codegen_compile(lto_code_gen_t cg, size_t *length) {
- return cg->compile(length, sLastErrorString);
+ return cg->compile(length, DisableOpt, DisableInline, DisableGVNLoadPRE,
+ sLastErrorString);
}
/// lto_codegen_compile_to_file - Generates code for all added modules into one
/// native object file. The name of the file is written to name. Returns true on
/// error.
bool lto_codegen_compile_to_file(lto_code_gen_t cg, const char **name) {
- return !cg->compile_to_file(name, sLastErrorString);
+ return !cg->compile_to_file(name, DisableOpt, DisableInline, DisableGVNLoadPRE,
+ sLastErrorString);
}
/// lto_codegen_debug_options - Used to pass extra options to the code