[llvm] r242387 - Make ExecutionEngine owning a DataLayout

Mehdi Amini mehdi.amini at apple.com
Thu Jul 16 09:13:33 PDT 2015


Thanks for the patch, this is what I was looking for :)

— 
Mehdi

> On Jul 16, 2015, at 9:10 AM, Manuel Klimek <klimek at google.com> wrote:
> 
> Note that this patch also introduced UB with GCC, which has different execution order.
> 
> I have worked up a patch for that. Please apply before a potential resubmit. Thanks!
> 
> On Thu, Jul 16, 2015 at 2:23 PM Kuperstein, Michael M <michael.m.kuperstein at intel.com <mailto:michael.m.kuperstein at intel.com>> wrote:
> This broke ~20 ExecutionEngine tests on quite a few buildbots.
> See here, for example: http://lab.llvm.org:8011/builders/clang-x64-ninja-win7/builds/2617/ <http://lab.llvm.org:8011/builders/clang-x64-ninja-win7/builds/2617/>
> 
> I'm going to revert it for now.
> 
> Thanks,
>   Michael
> 
> -----Original Message-----
> From: llvm-commits-bounces at cs.uiuc.edu <mailto:llvm-commits-bounces at cs.uiuc.edu> [mailto:llvm-commits-bounces at cs.uiuc.edu <mailto:llvm-commits-bounces at cs.uiuc.edu>] On Behalf Of Mehdi Amini
> Sent: Thursday, July 16, 2015 09:17
> To: llvm-commits at cs.uiuc.edu <mailto:llvm-commits at cs.uiuc.edu>
> Subject: [llvm] r242387 - Make ExecutionEngine owning a DataLayout
> 
> Author: mehdi_amini
> Date: Thu Jul 16 01:17:14 2015
> New Revision: 242387
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=242387&view=rev <http://llvm.org/viewvc/llvm-project?rev=242387&view=rev>
> Log:
> Make ExecutionEngine owning a DataLayout
> 
> Summary:
> This change is part of a series of commits dedicated to have a single DataLayout during compilation by using always the one owned by the module.
> 
> The ExecutionEngine will act as an exception and will be unsafe to be reused across context. We don't enforce this rule but undefined behavior can occurs if the user tries to do it.
> 
> Reviewers: lhames
> 
> Subscribers: echristo, llvm-commits, rafael, yaron.keren
> 
> Differential Revision: http://reviews.llvm.org/D11110 <http://reviews.llvm.org/D11110>
> 
> From: Mehdi Amini <mehdi.amini at apple.com <mailto:mehdi.amini at apple.com>>
> 
> Modified:
>     llvm/trunk/include/llvm/ExecutionEngine/ExecutionEngine.h
>     llvm/trunk/lib/ExecutionEngine/ExecutionEngine.cpp
>     llvm/trunk/lib/ExecutionEngine/ExecutionEngineBindings.cpp
>     llvm/trunk/lib/ExecutionEngine/Interpreter/Execution.cpp
>     llvm/trunk/lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp
>     llvm/trunk/lib/ExecutionEngine/Interpreter/Interpreter.cpp
>     llvm/trunk/lib/ExecutionEngine/Interpreter/Interpreter.h
>     llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.cpp
>     llvm/trunk/lib/ExecutionEngine/Orc/OrcMCJITReplacement.h
> 
> Modified: llvm/trunk/include/llvm/ExecutionEngine/ExecutionEngine.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/ExecutionEngine.h?rev=242387&r1=242386&r2=242387&view=diff <http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ExecutionEngine/ExecutionEngine.h?rev=242387&r1=242386&r2=242387&view=diff>
> ==============================================================================
> --- llvm/trunk/include/llvm/ExecutionEngine/ExecutionEngine.h (original)
> +++ llvm/trunk/include/llvm/ExecutionEngine/ExecutionEngine.h Thu Jul 16
> +++ 01:17:14 2015
> @@ -104,7 +104,12 @@ class ExecutionEngine {
>    ExecutionEngineState EEState;
> 
>    /// The target data for the platform for which execution is being performed.
> -  const DataLayout *DL;
> +  ///
> +  /// Note: the DataLayout is LLVMContext specific because it has an
> + /// internal cache based on type pointers. It makes unsafe to reuse
> + the  /// ExecutionEngine across context, we don't enforce this rule
> + but undefined  /// behavior can occurs if the user tries to do it.
> +  const DataLayout DL;
> 
>    /// Whether lazy JIT compilation is enabled.
>    bool CompilingLazily;
> @@ -126,8 +131,6 @@ protected:
>    /// optimize for the case where there is only one module.
>    SmallVector<std::unique_ptr<Module>, 1> Modules;
> 
> -  void setDataLayout(const DataLayout *Val) { DL = Val; }
> -
>    /// getMemoryforGV - Allocate memory for a global variable.
>    virtual char *getMemoryForGV(const GlobalVariable *GV);
> 
> @@ -194,7 +197,7 @@ public:
> 
>    //===--------------------------------------------------------------------===//
> 
> -  const DataLayout *getDataLayout() const { return DL; }
> +  const DataLayout &getDataLayout() const { return DL; }
> 
>    /// removeModule - Remove a Module from the list of modules.  Returns true if
>    /// M is found.
> @@ -478,8 +481,8 @@ public:
>    }
> 
>  protected:
> -  ExecutionEngine() {}
> -  explicit ExecutionEngine(std::unique_ptr<Module> M);
> +  ExecutionEngine(const DataLayout DL) : DL(std::move(DL)){};  explicit
> + ExecutionEngine(const DataLayout DL, std::unique_ptr<Module> M);
> 
>    void emitGlobals();
> 
> 
> Modified: llvm/trunk/lib/ExecutionEngine/ExecutionEngine.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/ExecutionEngine.cpp?rev=242387&r1=242386&r2=242387&view=diff <http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/ExecutionEngine.cpp?rev=242387&r1=242386&r2=242387&view=diff>
> ==============================================================================
> --- llvm/trunk/lib/ExecutionEngine/ExecutionEngine.cpp (original)
> +++ llvm/trunk/lib/ExecutionEngine/ExecutionEngine.cpp Thu Jul 16
> +++ 01:17:14 2015
> @@ -61,8 +61,8 @@ ExecutionEngine *(*ExecutionEngine::Inte
> 
>  void JITEventListener::anchor() {}
> 
> -ExecutionEngine::ExecutionEngine(std::unique_ptr<Module> M)
> -  : LazyFunctionCreator(nullptr) {
> +ExecutionEngine::ExecutionEngine(const DataLayout DL, std::unique_ptr<Module> M)
> +    : DL(std::move(DL)), LazyFunctionCreator(nullptr) {
>    CompilingLazily         = false;
>    GVCompilationDisabled   = false;
>    SymbolSearchingDisabled = false;
> @@ -115,7 +115,7 @@ public:
>  }  // anonymous namespace
> 
>  char *ExecutionEngine::getMemoryForGV(const GlobalVariable *GV) {
> -  return GVMemoryBlock::Create(GV, *getDataLayout());
> +  return GVMemoryBlock::Create(GV, getDataLayout());
>  }
> 
>  void ExecutionEngine::addObjectFile(std::unique_ptr<object::ObjectFile> O) { @@ -326,7 +326,7 @@ void *ArgvArray::reset(LLVMContext &C, E
>                         const std::vector<std::string> &InputArgv) {
>    Values.clear();  // Free the old contents.
>    Values.reserve(InputArgv.size());
> -  unsigned PtrSize = EE->getDataLayout()->getPointerSize();
> +  unsigned PtrSize = EE->getDataLayout().getPointerSize();
>    Array = make_unique<char[]>((InputArgv.size()+1)*PtrSize);
> 
>    DEBUG(dbgs() << "JIT: ARGV = " << (void*)Array.get() << "\n"); @@ -401,7 +401,7 @@ void ExecutionEngine::runStaticConstruct
>  #ifndef NDEBUG
>  /// isTargetNullPtr - Return whether the target pointer stored at Loc is null.
>  static bool isTargetNullPtr(ExecutionEngine *EE, void *Loc) {
> -  unsigned PtrSize = EE->getDataLayout()->getPointerSize();
> +  unsigned PtrSize = EE->getDataLayout().getPointerSize();
>    for (unsigned i = 0; i < PtrSize; ++i)
>      if (*(i + (uint8_t*)Loc))
>        return false;
> @@ -634,8 +634,8 @@ GenericValue ExecutionEngine::getConstan
>      case Instruction::GetElementPtr: {
>        // Compute the index
>        GenericValue Result = getConstantValue(Op0);
> -      APInt Offset(DL->getPointerSizeInBits(), 0);
> -      cast<GEPOperator>(CE)->accumulateConstantOffset(*DL, Offset);
> +      APInt Offset(DL.getPointerSizeInBits(), 0);
> +      cast<GEPOperator>(CE)->accumulateConstantOffset(DL, Offset);
> 
>        char* tmp = (char*) Result.PointerVal;
>        Result = PTOGV(tmp + Offset.getSExtValue()); @@ -722,16 +722,16 @@ GenericValue ExecutionEngine::getConstan
>      }
>      case Instruction::PtrToInt: {
>        GenericValue GV = getConstantValue(Op0);
> -      uint32_t PtrWidth = DL->getTypeSizeInBits(Op0->getType());
> +      uint32_t PtrWidth = DL.getTypeSizeInBits(Op0->getType());
>        assert(PtrWidth <= 64 && "Bad pointer width");
>        GV.IntVal = APInt(PtrWidth, uintptr_t(GV.PointerVal));
> -      uint32_t IntWidth = DL->getTypeSizeInBits(CE->getType());
> +      uint32_t IntWidth = DL.getTypeSizeInBits(CE->getType());
>        GV.IntVal = GV.IntVal.zextOrTrunc(IntWidth);
>        return GV;
>      }
>      case Instruction::IntToPtr: {
>        GenericValue GV = getConstantValue(Op0);
> -      uint32_t PtrWidth = DL->getTypeSizeInBits(CE->getType());
> +      uint32_t PtrWidth = DL.getTypeSizeInBits(CE->getType());
>        GV.IntVal = GV.IntVal.zextOrTrunc(PtrWidth);
>        assert(GV.IntVal.getBitWidth() <= 64 && "Bad pointer width");
>        GV.PointerVal = PointerTy(uintptr_t(GV.IntVal.getZExtValue()));
> @@ -1033,7 +1033,7 @@ static void StoreIntToMemory(const APInt
> 
>  void ExecutionEngine::StoreValueToMemory(const GenericValue &Val,
>                                           GenericValue *Ptr, Type *Ty) {
> -  const unsigned StoreBytes = getDataLayout()->getTypeStoreSize(Ty);
> +  const unsigned StoreBytes = getDataLayout().getTypeStoreSize(Ty);
> 
>    switch (Ty->getTypeID()) {
>    default:
> @@ -1073,7 +1073,7 @@ void ExecutionEngine::StoreValueToMemory
>      break;
>    }
> 
> -  if (sys::IsLittleEndianHost != getDataLayout()->isLittleEndian())
> +  if (sys::IsLittleEndianHost != getDataLayout().isLittleEndian())
>      // Host and target are different endian - reverse the stored bytes.
>      std::reverse((uint8_t*)Ptr, StoreBytes + (uint8_t*)Ptr);  } @@ -1110,7 +1110,7 @@ static void LoadIntFromMemory(APInt &Int  void ExecutionEngine::LoadValueFromMemory(GenericValue &Result,
>                                            GenericValue *Ptr,
>                                            Type *Ty) {
> -  const unsigned LoadBytes = getDataLayout()->getTypeStoreSize(Ty);
> +  const unsigned LoadBytes = getDataLayout().getTypeStoreSize(Ty);
> 
>    switch (Ty->getTypeID()) {
>    case Type::IntegerTyID:
> @@ -1176,20 +1176,20 @@ void ExecutionEngine::InitializeMemory(c
> 
>    if (const ConstantVector *CP = dyn_cast<ConstantVector>(Init)) {
>      unsigned ElementSize =
> -      getDataLayout()->getTypeAllocSize(CP->getType()->getElementType());
> +
> + getDataLayout().getTypeAllocSize(CP->getType()->getElementType());
>      for (unsigned i = 0, e = CP->getNumOperands(); i != e; ++i)
>        InitializeMemory(CP->getOperand(i), (char*)Addr+i*ElementSize);
>      return;
>    }
> 
>    if (isa<ConstantAggregateZero>(Init)) {
> -    memset(Addr, 0, (size_t)getDataLayout()->getTypeAllocSize(Init->getType()));
> +    memset(Addr, 0,
> + (size_t)getDataLayout().getTypeAllocSize(Init->getType()));
>      return;
>    }
> 
>    if (const ConstantArray *CPA = dyn_cast<ConstantArray>(Init)) {
>      unsigned ElementSize =
> -      getDataLayout()->getTypeAllocSize(CPA->getType()->getElementType());
> +
> + getDataLayout().getTypeAllocSize(CPA->getType()->getElementType());
>      for (unsigned i = 0, e = CPA->getNumOperands(); i != e; ++i)
>        InitializeMemory(CPA->getOperand(i), (char*)Addr+i*ElementSize);
>      return;
> @@ -1197,7 +1197,7 @@ void ExecutionEngine::InitializeMemory(c
> 
>    if (const ConstantStruct *CPS = dyn_cast<ConstantStruct>(Init)) {
>      const StructLayout *SL =
> -      getDataLayout()->getStructLayout(cast<StructType>(CPS->getType()));
> +
> + getDataLayout().getStructLayout(cast<StructType>(CPS->getType()));
>      for (unsigned i = 0, e = CPS->getNumOperands(); i != e; ++i)
>        InitializeMemory(CPS->getOperand(i), (char*)Addr+SL->getElementOffset(i));
>      return;
> @@ -1342,7 +1342,7 @@ void ExecutionEngine::EmitGlobalVariable
>      InitializeMemory(GV->getInitializer(), GA);
> 
>    Type *ElTy = GV->getType()->getElementType();
> -  size_t GVSize = (size_t)getDataLayout()->getTypeAllocSize(ElTy);
> +  size_t GVSize = (size_t)getDataLayout().getTypeAllocSize(ElTy);
>    NumInitBytes += (unsigned)GVSize;
>    ++NumGlobals;
>  }
> 
> Modified: llvm/trunk/lib/ExecutionEngine/ExecutionEngineBindings.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/ExecutionEngineBindings.cpp?rev=242387&r1=242386&r2=242387&view=diff <http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/ExecutionEngineBindings.cpp?rev=242387&r1=242386&r2=242387&view=diff>
> ==============================================================================
> --- llvm/trunk/lib/ExecutionEngine/ExecutionEngineBindings.cpp (original)
> +++ llvm/trunk/lib/ExecutionEngine/ExecutionEngineBindings.cpp Thu Jul
> +++ 16 01:17:14 2015
> @@ -318,7 +318,7 @@ void *LLVMRecompileAndRelinkFunction(LLV
>  }
> 
>  LLVMTargetDataRef LLVMGetExecutionEngineTargetData(LLVMExecutionEngineRef EE) {
> -  return wrap(unwrap(EE)->getDataLayout());
> +  return wrap(&unwrap(EE)->getDataLayout());
>  }
> 
>  LLVMTargetMachineRef
> 
> Modified: llvm/trunk/lib/ExecutionEngine/Interpreter/Execution.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/Interpreter/Execution.cpp?rev=242387&r1=242386&r2=242387&view=diff <http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/Interpreter/Execution.cpp?rev=242387&r1=242386&r2=242387&view=diff>
> ==============================================================================
> --- llvm/trunk/lib/ExecutionEngine/Interpreter/Execution.cpp (original)
> +++ llvm/trunk/lib/ExecutionEngine/Interpreter/Execution.cpp Thu Jul 16
> +++ 01:17:14 2015
> @@ -968,7 +968,7 @@ void Interpreter::visitAllocaInst(Alloca
>    unsigned NumElements =
>      getOperandValue(I.getOperand(0), SF).IntVal.getZExtValue();
> 
> -  unsigned TypeSize = (size_t)TD.getTypeAllocSize(Ty);
> +  unsigned TypeSize = (size_t)getDataLayout().getTypeAllocSize(Ty);
> 
>    // Avoid malloc-ing zero bytes, use max()...
>    unsigned MemToAlloc = std::max(1U, NumElements * TypeSize); @@ -1000,7 +1000,7 @@ GenericValue Interpreter::executeGEPOper
> 
>    for (; I != E; ++I) {
>      if (StructType *STy = dyn_cast<StructType>(*I)) {
> -      const StructLayout *SLO = TD.getStructLayout(STy);
> +      const StructLayout *SLO = getDataLayout().getStructLayout(STy);
> 
>        const ConstantInt *CPU = cast<ConstantInt>(I.getOperand());
>        unsigned Index = unsigned(CPU->getZExtValue()); @@ -1020,7 +1020,7 @@ GenericValue Interpreter::executeGEPOper
>          assert(BitWidth == 64 && "Invalid index type for getelementptr");
>          Idx = (int64_t)IdxGV.IntVal.getZExtValue();
>        }
> -      Total += TD.getTypeAllocSize(ST->getElementType())*Idx;
> +      Total += getDataLayout().getTypeAllocSize(ST->getElementType()) *
> + Idx;
>      }
>    }
> 
> @@ -1477,7 +1477,7 @@ GenericValue Interpreter::executeIntToPt
>    GenericValue Dest, Src = getOperandValue(SrcVal, SF);
>    assert(DstTy->isPointerTy() && "Invalid PtrToInt instruction");
> 
> -  uint32_t PtrSize = TD.getPointerSizeInBits();
> +  uint32_t PtrSize = getDataLayout().getPointerSizeInBits();
>    if (PtrSize != Src.IntVal.getBitWidth())
>      Src.IntVal = Src.IntVal.zextOrTrunc(PtrSize);
> 
> @@ -1497,7 +1497,7 @@ GenericValue Interpreter::executeBitCast
>        (DstTy->getTypeID() == Type::VectorTyID)) {
>      // vector src bitcast to vector dst or vector src bitcast to scalar dst or
>      // scalar src bitcast to vector dst
> -    bool isLittleEndian = TD.isLittleEndian();
> +    bool isLittleEndian = getDataLayout().isLittleEndian();
>      GenericValue TempDst, TempSrc, SrcVec;
>      const Type *SrcElemTy;
>      const Type *DstElemTy;
> 
> Modified: llvm/trunk/lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp?rev=242387&r1=242386&r2=242387&view=diff <http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp?rev=242387&r1=242386&r2=242387&view=diff>
> ==============================================================================
> --- llvm/trunk/lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp (original)
> +++ llvm/trunk/lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp Thu
> +++ Jul 16 01:17:14 2015
> @@ -368,7 +368,7 @@ static GenericValue lle_X_sprintf(Functi
>        case 'x': case 'X':
>          if (HowLong >= 1) {
>            if (HowLong == 1 &&
> -              TheInterpreter->getDataLayout()->getPointerSizeInBits() == 64 &&
> +              TheInterpreter->getDataLayout().getPointerSizeInBits() ==
> + 64 &&
>                sizeof(long) < sizeof(int64_t)) {
>              // Make sure we use %lld with a 64 bit argument because we might be
>              // compiling LLI on a 32 bit compiler.
> 
> Modified: llvm/trunk/lib/ExecutionEngine/Interpreter/Interpreter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/Interpreter/Interpreter.cpp?rev=242387&r1=242386&r2=242387&view=diff <http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/Interpreter/Interpreter.cpp?rev=242387&r1=242386&r2=242387&view=diff>
> ==============================================================================
> --- llvm/trunk/lib/ExecutionEngine/Interpreter/Interpreter.cpp (original)
> +++ llvm/trunk/lib/ExecutionEngine/Interpreter/Interpreter.cpp Thu Jul
> +++ 16 01:17:14 2015
> @@ -49,16 +49,15 @@ ExecutionEngine *Interpreter::create(std  // Interpreter ctor - Initialize stuff  //  Interpreter::Interpreter(std::unique_ptr<Module> M)
> -  : ExecutionEngine(std::move(M)), TD(Modules.back().get()) {
> +    : ExecutionEngine(M->getDataLayout(), std::move(M)) {
> 
>    memset(&ExitValue.Untyped, 0, sizeof(ExitValue.Untyped));
> -  setDataLayout(&TD);
>    // Initialize the "backend"
>    initializeExecutionEngine();
>    initializeExternalFunctions();
>    emitGlobals();
> 
> -  IL = new IntrinsicLowering(TD);
> +  IL = new IntrinsicLowering(getDataLayout());
>  }
> 
>  Interpreter::~Interpreter() {
> 
> Modified: llvm/trunk/lib/ExecutionEngine/Interpreter/Interpreter.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/Interpreter/Interpreter.h?rev=242387&r1=242386&r2=242387&view=diff <http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/Interpreter/Interpreter.h?rev=242387&r1=242386&r2=242387&view=diff>
> ==============================================================================
> --- llvm/trunk/lib/ExecutionEngine/Interpreter/Interpreter.h (original)
> +++ llvm/trunk/lib/ExecutionEngine/Interpreter/Interpreter.h Thu Jul 16
> +++ 01:17:14 2015
> @@ -95,7 +95,6 @@ struct ExecutionContext {  //  class Interpreter : public ExecutionEngine, public InstVisitor<Interpreter> {
>    GenericValue ExitValue;          // The return value of the called function
> -  DataLayout TD;
>    IntrinsicLowering *IL;
> 
>    // The runtime stack of executing code.  The top of the stack is the current
> 
> Modified: llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.cpp?rev=242387&r1=242386&r2=242387&view=diff <http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.cpp?rev=242387&r1=242386&r2=242387&view=diff>
> ==============================================================================
> --- llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.cpp (original)
> +++ llvm/trunk/lib/ExecutionEngine/MCJIT/MCJIT.cpp Thu Jul 16 01:17:14
> +++ 2015
> @@ -65,12 +65,13 @@ MCJIT::createJIT(std::unique_ptr<Module>
>                     std::move(Resolver));  }
> 
> -MCJIT::MCJIT(std::unique_ptr<Module> M, std::unique_ptr<TargetMachine> tm,
> +MCJIT::MCJIT(std::unique_ptr<Module> M, std::unique_ptr<TargetMachine>
> +TM,
>               std::shared_ptr<MCJITMemoryManager> MemMgr,
>               std::shared_ptr<RuntimeDyld::SymbolResolver> Resolver)
> -    : ExecutionEngine(std::move(M)), TM(std::move(tm)), Ctx(nullptr),
> -      MemMgr(std::move(MemMgr)), Resolver(*this, std::move(Resolver)),
> -      Dyld(*this->MemMgr, this->Resolver), ObjCache(nullptr) {
> +    : ExecutionEngine(*TM->getDataLayout(), std::move(M)), TM(std::move(TM)),
> +      Ctx(nullptr), MemMgr(std::move(MemMgr)),
> +      Resolver(*this, std::move(Resolver)), Dyld(*this->MemMgr, this->Resolver),
> +      ObjCache(nullptr) {
>    // FIXME: We are managing our modules, so we do not want the base class
>    // ExecutionEngine to manage them as well. To avoid double destruction
>    // of the first (and only) module added in ExecutionEngine constructor @@ -85,7 +86,6 @@ MCJIT::MCJIT(std::unique_ptr<Module> M,
>    Modules.clear();
> 
>    OwnedModules.addModule(std::move(First));
> -  setDataLayout(TM->getDataLayout());
>    RegisterJITEventListener(JITEventListener::createGDBRegistrationListener());
>  }
> 
> @@ -193,7 +193,11 @@ void MCJIT::generateCodeForModule(Module
>    if (ObjCache)
>      ObjectToLoad = ObjCache->getObject(M);
> 
> -  M->setDataLayout(*TM->getDataLayout());
> +  if (M->getDataLayout().isDefault()) {
> +    M->setDataLayout(getDataLayout());
> +  } else {
> +    assert(M->getDataLayout() == getDataLayout() && "DataLayout
> + Mismatch");  }
> 
>    // If the cache did not contain a suitable object, compile the object
>    if (!ObjectToLoad) {
> @@ -265,7 +269,7 @@ void MCJIT::finalizeModule(Module *M) {
> 
>  RuntimeDyld::SymbolInfo MCJIT::findExistingSymbol(const std::string &Name) {
>    SmallString<128> FullName;
> -  Mangler::getNameWithPrefix(FullName, Name, *TM->getDataLayout());
> +  Mangler::getNameWithPrefix(FullName, Name, getDataLayout());
>    return Dyld.getSymbol(FullName);
>  }
> 
> 
> Modified: llvm/trunk/lib/ExecutionEngine/Orc/OrcMCJITReplacement.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/Orc/OrcMCJITReplacement.h?rev=242387&r1=242386&r2=242387&view=diff <http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/Orc/OrcMCJITReplacement.h?rev=242387&r1=242386&r2=242387&view=diff>
> ==============================================================================
> --- llvm/trunk/lib/ExecutionEngine/Orc/OrcMCJITReplacement.h (original)
> +++ llvm/trunk/lib/ExecutionEngine/Orc/OrcMCJITReplacement.h Thu Jul 16
> +++ 01:17:14 2015
> @@ -137,25 +137,26 @@ public:
>    }
> 
>    OrcMCJITReplacement(
> -                    std::shared_ptr<MCJITMemoryManager> MemMgr,
> -                    std::shared_ptr<RuntimeDyld::SymbolResolver> ClientResolver,
> -                    std::unique_ptr<TargetMachine> TM)
> -      : TM(std::move(TM)), MemMgr(*this, std::move(MemMgr)),
> -        Resolver(*this), ClientResolver(std::move(ClientResolver)),
> -        NotifyObjectLoaded(*this), NotifyFinalized(*this),
> +      std::shared_ptr<MCJITMemoryManager> MemMgr,
> +      std::shared_ptr<RuntimeDyld::SymbolResolver> ClientResolver,
> +      std::unique_ptr<TargetMachine> TM)
> +      : ExecutionEngine(*TM->getDataLayout()), TM(std::move(TM)),
> +        MemMgr(*this, std::move(MemMgr)), Resolver(*this),
> +        ClientResolver(std::move(ClientResolver)), NotifyObjectLoaded(*this),
> +        NotifyFinalized(*this),
>          ObjectLayer(NotifyObjectLoaded, NotifyFinalized),
>          CompileLayer(ObjectLayer, SimpleCompiler(*this->TM)),
> -        LazyEmitLayer(CompileLayer) {
> -    setDataLayout(this->TM->getDataLayout());
> -  }
> +        LazyEmitLayer(CompileLayer) {}
> 
>    void addModule(std::unique_ptr<Module> M) override {
> 
>      // If this module doesn't have a DataLayout attached then attach the
>      // default.
> -    if (M->getDataLayout().isDefault())
> -      M->setDataLayout(*getDataLayout());
> -
> +    if (M->getDataLayout().isDefault()) {
> +      M->setDataLayout(getDataLayout());
> +    } else {
> +      assert(M->getDataLayout() == getDataLayout() && "DataLayout Mismatch");
> +    }
>      Modules.push_back(std::move(M));
>      std::vector<Module *> Ms;
>      Ms.push_back(&*Modules.back());
> @@ -310,7 +311,7 @@ private:
>      std::string MangledName;
>      {
>        raw_string_ostream MangledNameStream(MangledName);
> -      Mang.getNameWithPrefix(MangledNameStream, Name, *TM->getDataLayout());
> +      Mang.getNameWithPrefix(MangledNameStream, Name, getDataLayout());
>      }
>      return MangledName;
>    }
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu <mailto:llvm-commits at cs.uiuc.edu>
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits <http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits>
> ---------------------------------------------------------------------
> Intel Israel (74) Limited
> 
> This e-mail and any attachments may contain confidential material for
> the sole use of the intended recipient(s). Any review or distribution
> by others is strictly prohibited. If you are not the intended
> recipient, please contact the sender and delete all copies.
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu <mailto:llvm-commits at cs.uiuc.edu>
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits <http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits>
> <undef.patch>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150716/ca56e8da/attachment.html>


More information about the llvm-commits mailing list