[llvm] r180893 - This exposes more MCJIT options via the C API:
Aaron Ballman
aaron at aaronballman.com
Fri May 10 07:48:15 PDT 2013
This has caused the Windows build bots to go red:
8> ******************** TEST 'LLVM-Unit ::
ExecutionEngine/MCJIT/F:\llvm\build\unittests\ExecutionEngine\MCJIT\Debug/MCJITTests.exe/MCJITCAPITest.simple_function'
FAILED ********************
8> Note: Google Test filter = MCJITCAPITest.simple_function
8>
8> [==========] Running 1 test from 1 test case.
8>
8> [----------] Global test environment set-up.
8>
8> [----------] 1 test from MCJITCAPITest
8>
8> [ RUN ] MCJITCAPITest.simple_function
8>
8>CUSTOMBUILD : LLVM error : Incompatible object format!
8>
8>
8> ********************
8>
8> Testing Time: 67.20s
8> ********************
8> Failing Tests (1):
8> LLVM-Unit ::
ExecutionEngine/MCJIT/F:\llvm\build\unittests\ExecutionEngine\MCJIT\Debug/MCJITTests.exe/MCJITCAPITest.simple_function
8>
8> Expected Passes : 5476
8> Expected Failures : 31
8> Unsupported Tests : 3120
8> Unexpected Failures: 1
8> lit.py: LitConfig.py:103: note: Unable to find 'bash.exe'.
8>
8>Build FAILED.
This is happening for me on MSVC 11, Windows 7 x64 with a debug build
~Aaron
On Wed, May 1, 2013 at 6:58 PM, Filip Pizlo <fpizlo at apple.com> wrote:
> Author: fpizlo
> Date: Wed May 1 17:58:00 2013
> New Revision: 180893
>
> URL: http://llvm.org/viewvc/llvm-project?rev=180893&view=rev
> Log:
> This exposes more MCJIT options via the C API:
>
> CodeModel: It's now possible to create an MCJIT instance with any CodeModel you like. Previously it was only possible to
> create an MCJIT that used CodeModel::JITDefault.
>
> EnableFastISel: It's now possible to turn on the fast instruction selector.
>
> The CodeModel option required some trickery. The problem is that previously, we were ensuring future binary compatibility in
> the MCJITCompilerOptions by mandating that the user bzero's the options struct and passes the sizeof() that he saw; the
> bindings then bzero the remaining bits. This works great but assumes that the bitwise zero equivalent of any field is a
> sensible default value.
>
> But this is not the case for LLVMCodeModel, or its internal equivalent, llvm::CodeModel::Model. In both of those, the default
> for a JIT is CodeModel::JITDefault (or LLVMCodeModelJITDefault), which is not bitwise zero.
>
> Hence this change introduces LLVMInitializeMCJITCompilerOptions(), which will initialize the user's options struct with
> defaults. The user will use this in the same way that they would have previously used memset() or bzero(). MCJITCAPITest.cpp
> illustrates the change, as does the comment in ExecutionEngine.h.
>
>
> Modified:
> llvm/trunk/include/llvm-c/ExecutionEngine.h
> llvm/trunk/include/llvm/Support/CodeGen.h
> llvm/trunk/lib/ExecutionEngine/ExecutionEngineBindings.cpp
> llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.cpp
> llvm/trunk/lib/Target/TargetMachineC.cpp
> llvm/trunk/unittests/ExecutionEngine/MCJIT/MCJITCAPITest.cpp
>
> Modified: llvm/trunk/include/llvm-c/ExecutionEngine.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm-c/ExecutionEngine.h?rev=180893&r1=180892&r2=180893&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm-c/ExecutionEngine.h (original)
> +++ llvm/trunk/include/llvm-c/ExecutionEngine.h Wed May 1 17:58:00 2013
> @@ -21,6 +21,7 @@
>
> #include "llvm-c/Core.h"
> #include "llvm-c/Target.h"
> +#include "llvm-c/TargetMachine.h"
>
> #ifdef __cplusplus
> extern "C" {
> @@ -42,7 +43,9 @@ typedef struct LLVMOpaqueExecutionEngine
>
> struct LLVMMCJITCompilerOptions {
> unsigned OptLevel;
> + LLVMCodeModel CodeModel;
> LLVMBool NoFramePointerElim;
> + LLVMBool EnableFastISel;
> };
>
> /*===-- Operations on generic values --------------------------------------===*/
> @@ -81,27 +84,30 @@ LLVMBool LLVMCreateJITCompilerForModule(
> unsigned OptLevel,
> char **OutError);
>
> +void LLVMInitializeMCJITCompilerOptions(
> + struct LLVMMCJITCompilerOptions *Options, size_t SizeOfOptions);
> +
> /**
> * Create an MCJIT execution engine for a module, with the given options. It is
> * the responsibility of the caller to ensure that all fields in Options up to
> - * the given SizeOfOptions are initialized. It is correct to pass a smaller value
> - * of SizeOfOptions that omits some fields, and it is also correct to set any
> - * field to zero. The canonical way of using this is:
> + * the given SizeOfOptions are initialized. It is correct to pass a smaller
> + * value of SizeOfOptions that omits some fields. The canonical way of using
> + * this is:
> *
> * LLVMMCJITCompilerOptions options;
> - * memset(&options, 0, sizeof(options));
> + * LLVMInitializeMCJITCompilerOptions(&options, sizeof(options));
> * ... fill in those options you care about
> - * LLVMCreateMCJITCompilerForModule(&jit, mod, &options, sizeof(options), &error);
> + * LLVMCreateMCJITCompilerForModule(&jit, mod, &options, sizeof(options),
> + * &error);
> *
> * Note that this is also correct, though possibly suboptimal:
> *
> * LLVMCreateMCJITCompilerForModule(&jit, mod, 0, 0, &error);
> */
> -LLVMBool LLVMCreateMCJITCompilerForModule(LLVMExecutionEngineRef *OutJIT,
> - LLVMModuleRef M,
> - struct LLVMMCJITCompilerOptions *Options,
> - size_t SizeOfOptions,
> - char **OutError);
> +LLVMBool LLVMCreateMCJITCompilerForModule(
> + LLVMExecutionEngineRef *OutJIT, LLVMModuleRef M,
> + struct LLVMMCJITCompilerOptions *Options, size_t SizeOfOptions,
> + char **OutError);
>
> /** Deprecated: Use LLVMCreateExecutionEngineForModule instead. */
> LLVMBool LLVMCreateExecutionEngine(LLVMExecutionEngineRef *OutEE,
> @@ -151,7 +157,8 @@ LLVMBool LLVMRemoveModuleProvider(LLVMEx
> LLVMBool LLVMFindFunction(LLVMExecutionEngineRef EE, const char *Name,
> LLVMValueRef *OutFn);
>
> -void *LLVMRecompileAndRelinkFunction(LLVMExecutionEngineRef EE, LLVMValueRef Fn);
> +void *LLVMRecompileAndRelinkFunction(LLVMExecutionEngineRef EE,
> + LLVMValueRef Fn);
>
> LLVMTargetDataRef LLVMGetExecutionEngineTargetData(LLVMExecutionEngineRef EE);
>
>
> Modified: llvm/trunk/include/llvm/Support/CodeGen.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Support/CodeGen.h?rev=180893&r1=180892&r2=180893&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/Support/CodeGen.h (original)
> +++ llvm/trunk/include/llvm/Support/CodeGen.h Wed May 1 17:58:00 2013
> @@ -15,6 +15,9 @@
> #ifndef LLVM_SUPPORT_CODEGEN_H
> #define LLVM_SUPPORT_CODEGEN_H
>
> +#include "llvm-c/TargetMachine.h"
> +#include "llvm/Support/ErrorHandling.h"
> +
> namespace llvm {
>
> // Relocation model types.
> @@ -47,6 +50,42 @@ namespace llvm {
> };
> }
>
> + // Create wrappers for C Binding types (see CBindingWrapping.h).
> + inline CodeModel::Model unwrap(LLVMCodeModel Model) {
> + switch (Model) {
> + case LLVMCodeModelDefault:
> + return CodeModel::Default;
> + case LLVMCodeModelJITDefault:
> + return CodeModel::JITDefault;
> + case LLVMCodeModelSmall:
> + return CodeModel::Small;
> + case LLVMCodeModelKernel:
> + return CodeModel::Kernel;
> + case LLVMCodeModelMedium:
> + return CodeModel::Medium;
> + case LLVMCodeModelLarge:
> + return CodeModel::Large;
> + }
> + return CodeModel::Default;
> + }
> +
> + inline LLVMCodeModel wrap(CodeModel::Model Model) {
> + switch (Model) {
> + case CodeModel::Default:
> + return LLVMCodeModelDefault;
> + case CodeModel::JITDefault:
> + return LLVMCodeModelJITDefault;
> + case CodeModel::Small:
> + return LLVMCodeModelSmall;
> + case CodeModel::Kernel:
> + return LLVMCodeModelKernel;
> + case CodeModel::Medium:
> + return LLVMCodeModelMedium;
> + case CodeModel::Large:
> + return LLVMCodeModelLarge;
> + }
> + llvm_unreachable("Bad CodeModel!");
> + }
> } // end llvm namespace
>
> #endif
>
> Modified: llvm/trunk/lib/ExecutionEngine/ExecutionEngineBindings.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/ExecutionEngineBindings.cpp?rev=180893&r1=180892&r2=180893&view=diff
> ==============================================================================
> --- llvm/trunk/lib/ExecutionEngine/ExecutionEngineBindings.cpp (original)
> +++ llvm/trunk/lib/ExecutionEngine/ExecutionEngineBindings.cpp Wed May 1 17:58:00 2013
> @@ -154,18 +154,29 @@ LLVMBool LLVMCreateJITCompilerForModule(
> return 1;
> }
>
> -LLVMBool LLVMCreateMCJITCompilerForModule(LLVMExecutionEngineRef *OutJIT,
> - LLVMModuleRef M,
> - LLVMMCJITCompilerOptions *PassedOptions,
> - size_t SizeOfPassedOptions,
> - char **OutError) {
> +void LLVMInitializeMCJITCompilerOptions(LLVMMCJITCompilerOptions *PassedOptions,
> + size_t SizeOfPassedOptions) {
> + LLVMMCJITCompilerOptions options;
> + options.OptLevel = 0;
> + options.CodeModel = LLVMCodeModelJITDefault;
> + options.NoFramePointerElim = false;
> + options.EnableFastISel = false;
> +
> + memcpy(PassedOptions, &options,
> + std::min(sizeof(options), SizeOfPassedOptions));
> +}
> +
> +LLVMBool LLVMCreateMCJITCompilerForModule(
> + LLVMExecutionEngineRef *OutJIT, LLVMModuleRef M,
> + LLVMMCJITCompilerOptions *PassedOptions, size_t SizeOfPassedOptions,
> + char **OutError) {
> LLVMMCJITCompilerOptions options;
> // If the user passed a larger sized options struct, then they were compiled
> // against a newer LLVM. Tell them that something is wrong.
> if (SizeOfPassedOptions > sizeof(options)) {
> *OutError = strdup(
> - "Refusing to use options struct that is larger than my own; assuming LLVM "
> - "library mismatch.");
> + "Refusing to use options struct that is larger than my own; assuming "
> + "LLVM library mismatch.");
> return 1;
> }
>
> @@ -173,11 +184,12 @@ LLVMBool LLVMCreateMCJITCompilerForModul
> // any fields they didn't see are cleared. We must defend against fields being
> // set to the bitwise equivalent of zero, and assume that this means "do the
> // default" as if that option hadn't been available.
> - memset(&options, 0, sizeof(options));
> + LLVMInitializeMCJITCompilerOptions(&options, sizeof(options));
> memcpy(&options, PassedOptions, SizeOfPassedOptions);
>
> TargetOptions targetOptions;
> targetOptions.NoFramePointerElim = options.NoFramePointerElim;
> + targetOptions.EnableFastISel = options.EnableFastISel;
>
> std::string Error;
> EngineBuilder builder(unwrap(M));
> @@ -185,6 +197,7 @@ LLVMBool LLVMCreateMCJITCompilerForModul
> .setErrorStr(&Error)
> .setUseMCJIT(true)
> .setOptLevel((CodeGenOpt::Level)options.OptLevel)
> + .setCodeModel(unwrap(options.CodeModel))
> .setTargetOptions(targetOptions);
> if (ExecutionEngine *JIT = builder.create()) {
> *OutJIT = wrap(JIT);
> @@ -300,7 +313,8 @@ LLVMBool LLVMFindFunction(LLVMExecutionE
> return 1;
> }
>
> -void *LLVMRecompileAndRelinkFunction(LLVMExecutionEngineRef EE, LLVMValueRef Fn) {
> +void *LLVMRecompileAndRelinkFunction(LLVMExecutionEngineRef EE,
> + LLVMValueRef Fn) {
> return unwrap(EE)->recompileAndRelinkFunction(unwrap<Function>(Fn));
> }
>
>
> Modified: llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.cpp?rev=180893&r1=180892&r2=180893&view=diff
> ==============================================================================
> --- llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.cpp (original)
> +++ llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.cpp Wed May 1 17:58:00 2013
> @@ -52,7 +52,8 @@ ExecutionEngine *MCJIT::createJIT(Module
>
> MCJIT::MCJIT(Module *m, TargetMachine *tm, RTDyldMemoryManager *MM,
> bool AllocateGVsWithCode)
> - : ExecutionEngine(m), TM(tm), Ctx(0), MemMgr(MM), Dyld(MM),
> + : ExecutionEngine(m), TM(tm), Ctx(0),
> + MemMgr(MM ? MM : new SectionMemoryManager()), Dyld(MemMgr),
> IsLoaded(false), M(m), ObjCache(0) {
>
> setDataLayout(TM->getDataLayout());
>
> Modified: llvm/trunk/lib/Target/TargetMachineC.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/TargetMachineC.cpp?rev=180893&r1=180892&r2=180893&view=diff
> ==============================================================================
> --- llvm/trunk/lib/Target/TargetMachineC.cpp (original)
> +++ llvm/trunk/lib/Target/TargetMachineC.cpp Wed May 1 17:58:00 2013
> @@ -106,29 +106,9 @@ LLVMTargetMachineRef LLVMCreateTargetMac
> break;
> }
>
> - CodeModel::Model CM;
> - switch (CodeModel) {
> - case LLVMCodeModelJITDefault:
> - CM = CodeModel::JITDefault;
> - break;
> - case LLVMCodeModelSmall:
> - CM = CodeModel::Small;
> - break;
> - case LLVMCodeModelKernel:
> - CM = CodeModel::Kernel;
> - break;
> - case LLVMCodeModelMedium:
> - CM = CodeModel::Medium;
> - break;
> - case LLVMCodeModelLarge:
> - CM = CodeModel::Large;
> - break;
> - default:
> - CM = CodeModel::Default;
> - break;
> - }
> - CodeGenOpt::Level OL;
> + CodeModel::Model CM = unwrap(CodeModel);
>
> + CodeGenOpt::Level OL;
> switch (Level) {
> case LLVMCodeGenLevelNone:
> OL = CodeGenOpt::None;
>
> Modified: llvm/trunk/unittests/ExecutionEngine/MCJIT/MCJITCAPITest.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/ExecutionEngine/MCJIT/MCJITCAPITest.cpp?rev=180893&r1=180892&r2=180893&view=diff
> ==============================================================================
> --- llvm/trunk/unittests/ExecutionEngine/MCJIT/MCJITCAPITest.cpp (original)
> +++ llvm/trunk/unittests/ExecutionEngine/MCJIT/MCJITCAPITest.cpp Wed May 1 17:58:00 2013
> @@ -64,7 +64,7 @@ TEST_F(MCJITCAPITest, simple_function) {
> LLVMDisposeBuilder(builder);
>
> LLVMMCJITCompilerOptions options;
> - memset(&options, 0, sizeof(options));
> + LLVMInitializeMCJITCompilerOptions(&options, sizeof(options));
> options.OptLevel = 2;
>
> // Just ensure that this field still exists.
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list