[llvm] r180893 - This exposes more MCJIT options via the C API:
Aaron Ballman
aaron at aaronballman.com
Fri May 10 11:13:21 PDT 2013
Thanks Andrew!
~Aaron
On Fri, May 10, 2013 at 2:00 PM, Kaylor, Andrew <andrew.kaylor at intel.com> wrote:
> Thanks for bringing this up, Aaron.
>
> It should be fixed in r181614.
>
> -Andy
>
> -----Original Message-----
> From: llvm-commits-bounces at cs.uiuc.edu [mailto:llvm-commits-bounces at cs.uiuc.edu] On Behalf Of Aaron Ballman
> Sent: Friday, May 10, 2013 7:48 AM
> To: Filip Pizlo
> Cc: llvm-commits
> Subject: Re: [llvm] r180893 - This exposes more MCJIT options via the C API:
>
> 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/Executio
>> nEngine.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/Co
>> deGen.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/Exe
>> cutionEngineBindings.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/MCJ
>> IT/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/TargetMachin
>> eC.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/ExecutionEngi
>> ne/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
> _______________________________________________
> 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