[llvm] r242387 - Make ExecutionEngine owning a DataLayout

Manuel Klimek klimek at google.com
Thu Jul 16 09:10:19 PDT 2015


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> 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/
>
> 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] On Behalf Of Mehdi Amini
> Sent: Thursday, July 16, 2015 09:17
> To: 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
> 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
>
> From: Mehdi Amini <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
>
> ==============================================================================
> --- 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
>
> ==============================================================================
> --- 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
>
> ==============================================================================
> --- 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
>
> ==============================================================================
> --- 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
>
> ==============================================================================
> --- 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
>
> ==============================================================================
> --- 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
>
> ==============================================================================
> --- 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
>
> ==============================================================================
> --- 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
>
> ==============================================================================
> --- 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
> 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
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150716/9d36b8ec/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: undef.patch
Type: text/x-patch
Size: 2654 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150716/9d36b8ec/attachment.bin>


More information about the llvm-commits mailing list