[llvm] r180893 - This exposes more MCJIT options via the C API:

Kaylor, Andrew andrew.kaylor at intel.com
Fri May 10 11:00:03 PDT 2013


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