[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