Skip to content

Commit

Permalink
Remove access to the DataLayout in the TargetMachine
Browse files Browse the repository at this point in the history
Summary:
Replace getDataLayout() with a createDataLayout() method to make
explicit that it is intended to create a DataLayout only and not
accessing it for other purpose.

This change is the last of a series of commits dedicated to have a
single DataLayout during compilation by using always the one owned
by the module.

Reviewers: echristo

Subscribers: jholewinski, llvm-commits, rafael, yaron.keren

Differential Revision: http://reviews.llvm.org/D11103

(cherry picked from commit 5609fc56bca971e5a7efeaa6ca4676638eaec5ea)

From: Mehdi Amini <[email protected]>

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@243083 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
joker-eph committed Jul 24, 2015
1 parent 994d771 commit 0f720d9
Show file tree
Hide file tree
Showing 17 changed files with 75 additions and 61 deletions.
4 changes: 2 additions & 2 deletions examples/Kaleidoscope/Orc/fully_lazy/toy.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -717,7 +717,7 @@ class IRGenContext {
M(new Module(GenerateUniqueName("jit_module_"),
Session.getLLVMContext())),
Builder(Session.getLLVMContext()) {
M->setDataLayout(*Session.getTarget().getDataLayout());
M->setDataLayout(Session.getTarget().createDataLayout());
}

SessionContext& getSession() { return Session; }
Expand Down Expand Up @@ -1179,7 +1179,7 @@ class KaleidoscopeJIT {
{
raw_string_ostream MangledNameStream(MangledName);
Mangler::getNameWithPrefix(MangledNameStream, Name,
*Session.getTarget().getDataLayout());
Session.getTarget().createDataLayout());
}
return MangledName;
}
Expand Down
6 changes: 3 additions & 3 deletions examples/Kaleidoscope/Orc/initial/toy.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -716,7 +716,7 @@ class IRGenContext {
M(new Module(GenerateUniqueName("jit_module_"),
Session.getLLVMContext())),
Builder(Session.getLLVMContext()) {
M->setDataLayout(*Session.getTarget().getDataLayout());
M->setDataLayout(Session.getTarget().createDataLayout());
}

SessionContext& getSession() { return Session; }
Expand Down Expand Up @@ -1160,7 +1160,7 @@ class KaleidoscopeJIT {
typedef CompileLayerT::ModuleSetHandleT ModuleHandleT;

KaleidoscopeJIT(SessionContext &Session)
: DL(*Session.getTarget().getDataLayout()),
: DL(Session.getTarget().createDataLayout()),
CompileLayer(ObjectLayer, SimpleCompiler(Session.getTarget())) {}

std::string mangle(const std::string &Name) {
Expand Down Expand Up @@ -1201,7 +1201,7 @@ class KaleidoscopeJIT {
}

private:
const DataLayout &DL;
const DataLayout DL;
ObjLayerT ObjectLayer;
CompileLayerT CompileLayer;
};
Expand Down
6 changes: 3 additions & 3 deletions examples/Kaleidoscope/Orc/lazy_codegen/toy.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -716,7 +716,7 @@ class IRGenContext {
M(new Module(GenerateUniqueName("jit_module_"),
Session.getLLVMContext())),
Builder(Session.getLLVMContext()) {
M->setDataLayout(*Session.getTarget().getDataLayout());
M->setDataLayout(Session.getTarget().createDataLayout());
}

SessionContext& getSession() { return Session; }
Expand Down Expand Up @@ -1162,7 +1162,7 @@ class KaleidoscopeJIT {
typedef LazyEmitLayerT::ModuleSetHandleT ModuleHandleT;

KaleidoscopeJIT(SessionContext &Session)
: DL(*Session.getTarget().getDataLayout()),
: DL(Session.getTarget().createDataLayout()),
CompileLayer(ObjectLayer, SimpleCompiler(Session.getTarget())),
LazyEmitLayer(CompileLayer) {}

Expand Down Expand Up @@ -1204,7 +1204,7 @@ class KaleidoscopeJIT {
}

private:
const DataLayout &DL;
const DataLayout DL;
ObjLayerT ObjectLayer;
CompileLayerT CompileLayer;
LazyEmitLayerT LazyEmitLayer;
Expand Down
4 changes: 2 additions & 2 deletions examples/Kaleidoscope/Orc/lazy_irgen/toy.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -716,7 +716,7 @@ class IRGenContext {
M(new Module(GenerateUniqueName("jit_module_"),
Session.getLLVMContext())),
Builder(Session.getLLVMContext()) {
M->setDataLayout(*Session.getTarget().getDataLayout());
M->setDataLayout(Session.getTarget().createDataLayout());
}

SessionContext& getSession() { return Session; }
Expand Down Expand Up @@ -1170,7 +1170,7 @@ class KaleidoscopeJIT {
{
raw_string_ostream MangledNameStream(MangledName);
Mangler::getNameWithPrefix(MangledNameStream, Name,
*Session.getTarget().getDataLayout());
Session.getTarget().createDataLayout());
}
return MangledName;
}
Expand Down
17 changes: 13 additions & 4 deletions include/llvm/Target/TargetMachine.h
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,12 @@ class TargetMachine {
/// The Target that this machine was created for.
const Target &TheTarget;

/// For ABI type size and alignment.
/// DataLayout for the target: keep ABI type size and alignment.
///
/// The DataLayout is created based on the string representation provided
/// during construction. It is kept here only to avoid reparsing the string
/// but should not really be used during compilation, because it has an
/// internal cache that is context specific.
const DataLayout DL;

/// Triple string, CPU name, and target feature strings the TargetMachine
Expand Down Expand Up @@ -125,9 +130,13 @@ class TargetMachine {
return *static_cast<const STC*>(getSubtargetImpl(F));
}

/// This method returns a pointer to the DataLayout for the target. It should
/// be unchanging for every subtarget.
const DataLayout *getDataLayout() const { return &DL; }
/// Create a DataLayout.
const DataLayout createDataLayout() const { return DL; }

/// Get the pointer size for this target.
///
/// This is the only time the DataLayout in the TargetMachine is used.
unsigned getPointerSize() const { return DL.getPointerSize(); }

/// \brief Reset the target options based on the function's attributes.
// FIXME: Remove TargetOptions that affect per-function code generation
Expand Down
6 changes: 3 additions & 3 deletions lib/CodeGen/AsmPrinter/AsmPrinter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -139,9 +139,9 @@ const DataLayout &AsmPrinter::getDataLayout() const {
return MMI->getModule()->getDataLayout();
}

unsigned AsmPrinter::getPointerSize() const {
return TM.getDataLayout()->getPointerSize();
}
// Do not use the cached DataLayout because some client use it without a Module
// (llmv-dsymutil, llvm-dwarfdump).
unsigned AsmPrinter::getPointerSize() const { return TM.getPointerSize(); }

const MCSubtargetInfo &AsmPrinter::getSubtargetInfo() const {
assert(MF && "getSubtargetInfo requires a valid MachineFunction!");
Expand Down
2 changes: 1 addition & 1 deletion lib/ExecutionEngine/MCJIT/MCJIT.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ MCJIT::createJIT(std::unique_ptr<Module> M,
MCJIT::MCJIT(std::unique_ptr<Module> M, std::unique_ptr<TargetMachine> TM,
std::shared_ptr<MCJITMemoryManager> MemMgr,
std::shared_ptr<RuntimeDyld::SymbolResolver> Resolver)
: ExecutionEngine(*TM->getDataLayout(), std::move(M)), TM(std::move(TM)),
: ExecutionEngine(TM->createDataLayout(), 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) {
Expand Down
2 changes: 1 addition & 1 deletion lib/ExecutionEngine/Orc/OrcMCJITReplacement.h
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ class OrcMCJITReplacement : public ExecutionEngine {
std::shared_ptr<MCJITMemoryManager> MemMgr,
std::shared_ptr<RuntimeDyld::SymbolResolver> ClientResolver,
std::unique_ptr<TargetMachine> TM)
: ExecutionEngine(*TM->getDataLayout()), TM(std::move(TM)),
: ExecutionEngine(TM->createDataLayout()), TM(std::move(TM)),
MemMgr(*this, std::move(MemMgr)), Resolver(*this),
ClientResolver(std::move(ClientResolver)), NotifyObjectLoaded(*this),
NotifyFinalized(*this),
Expand Down
2 changes: 1 addition & 1 deletion lib/LTO/LTOCodeGenerator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -521,7 +521,7 @@ bool LTOCodeGenerator::optimize(bool DisableInline,
legacy::PassManager passes;

// Add an appropriate DataLayout instance for this module...
mergedModule->setDataLayout(*TargetMach->getDataLayout());
mergedModule->setDataLayout(TargetMach->createDataLayout());

passes.add(
createTargetTransformInfoWrapperPass(TargetMach->getTargetIRAnalysis()));
Expand Down
2 changes: 1 addition & 1 deletion lib/LTO/LTOModule.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -232,7 +232,7 @@ LTOModule *LTOModule::makeLTOModule(MemoryBufferRef Buffer,

TargetMachine *target = march->createTargetMachine(TripleStr, CPU, FeatureStr,
options);
M->setDataLayout(*target->getDataLayout());
M->setDataLayout(target->createDataLayout());

std::unique_ptr<object::IRObjectFile> IRObj(
new object::IRObjectFile(Buffer, std::move(M)));
Expand Down
10 changes: 5 additions & 5 deletions lib/Target/Sparc/SparcISelLowering.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1370,7 +1370,7 @@ static SPCC::CondCodes FPCondCCodeToFCC(ISD::CondCode CC) {
SparcTargetLowering::SparcTargetLowering(TargetMachine &TM,
const SparcSubtarget &STI)
: TargetLowering(TM), Subtarget(&STI) {
auto &DL = *TM.getDataLayout();
MVT PtrVT = MVT::getIntegerVT(8 * TM.getPointerSize());

// Set up the register classes.
addRegisterClass(MVT::i32, &SP::IntRegsRegClass);
Expand All @@ -1396,10 +1396,10 @@ SparcTargetLowering::SparcTargetLowering(TargetMachine &TM,
setTruncStoreAction(MVT::f128, MVT::f64, Expand);

// Custom legalize GlobalAddress nodes into LO/HI parts.
setOperationAction(ISD::GlobalAddress, getPointerTy(DL), Custom);
setOperationAction(ISD::GlobalTLSAddress, getPointerTy(DL), Custom);
setOperationAction(ISD::ConstantPool, getPointerTy(DL), Custom);
setOperationAction(ISD::BlockAddress, getPointerTy(DL), Custom);
setOperationAction(ISD::GlobalAddress, PtrVT, Custom);
setOperationAction(ISD::GlobalTLSAddress, PtrVT, Custom);
setOperationAction(ISD::ConstantPool, PtrVT, Custom);
setOperationAction(ISD::BlockAddress, PtrVT, Custom);

// Sparc doesn't have sext_inreg, replace them with shl/sra
setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::i16, Expand);
Expand Down
3 changes: 1 addition & 2 deletions lib/Target/SystemZ/SystemZISelLowering.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -84,8 +84,7 @@ static MachineOperand earlyUseOperand(MachineOperand Op) {
SystemZTargetLowering::SystemZTargetLowering(const TargetMachine &TM,
const SystemZSubtarget &STI)
: TargetLowering(TM), Subtarget(STI) {
auto &DL = *TM.getDataLayout();
MVT PtrVT = getPointerTy(DL);
MVT PtrVT = MVT::getIntegerVT(8 * TM.getPointerSize());

// Set up the register classes.
if (Subtarget.hasHighWord())
Expand Down
30 changes: 17 additions & 13 deletions lib/Target/TargetMachineC.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,15 +32,25 @@

using namespace llvm;


// The TargetMachine uses to offer access to a DataLayout member. This is reflected
// in the C API. For backward compatibility reason, this structure allows to keep
// a DataLayout member accessible to C client that have a handle to a
// LLVMTargetMachineRef.
struct LLVMOpaqueTargetMachine {
std::unique_ptr<TargetMachine> Machine;
DataLayout DL;
};


inline TargetMachine *unwrap(LLVMTargetMachineRef P) {
return reinterpret_cast<TargetMachine*>(P);
return P->Machine.get();
}
inline Target *unwrap(LLVMTargetRef P) {
return reinterpret_cast<Target*>(P);
}
inline LLVMTargetMachineRef wrap(const TargetMachine *P) {
return
reinterpret_cast<LLVMTargetMachineRef>(const_cast<TargetMachine*>(P));
return new LLVMOpaqueTargetMachine{ std::unique_ptr<TargetMachine>(const_cast<TargetMachine*>(P)), P->createDataLayout() };
}
inline LLVMTargetRef wrap(const Target * P) {
return reinterpret_cast<LLVMTargetRef>(const_cast<Target*>(P));
Expand Down Expand Up @@ -147,7 +157,7 @@ LLVMTargetMachineRef LLVMCreateTargetMachine(LLVMTargetRef T,


void LLVMDisposeTargetMachine(LLVMTargetMachineRef T) {
delete unwrap(T);
delete T;
}

LLVMTargetRef LLVMGetTargetMachineTarget(LLVMTargetMachineRef T) {
Expand All @@ -170,8 +180,9 @@ char* LLVMGetTargetMachineFeatureString(LLVMTargetMachineRef T) {
return strdup(StringRep.c_str());
}

/// @deprecated: see "struct LLVMOpaqueTargetMachine" description above
LLVMTargetDataRef LLVMGetTargetMachineData(LLVMTargetMachineRef T) {
return wrap(unwrap(T)->getDataLayout());
return wrap(&T->DL);
}

void LLVMSetTargetMachineAsmVerbosity(LLVMTargetMachineRef T,
Expand All @@ -190,14 +201,7 @@ static LLVMBool LLVMTargetMachineEmit(LLVMTargetMachineRef T, LLVMModuleRef M,

std::string error;

const DataLayout *td = TM->getDataLayout();

if (!td) {
error = "No DataLayout in TargetMachine";
*ErrorMessage = strdup(error.c_str());
return true;
}
Mod->setDataLayout(*td);
Mod->setDataLayout(TM->createDataLayout());

TargetMachine::CodeGenFileType ft;
switch (codegen) {
Expand Down
10 changes: 6 additions & 4 deletions lib/Target/X86/X86ISelLowering.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ X86TargetLowering::X86TargetLowering(const X86TargetMachine &TM,
: TargetLowering(TM), Subtarget(&STI) {
X86ScalarSSEf64 = Subtarget->hasSSE2();
X86ScalarSSEf32 = Subtarget->hasSSE1();
TD = TM.getDataLayout();
MVT PtrVT = MVT::getIntegerVT(8 * TM.getPointerSize());

// Set up the TargetLowering object.
static const MVT IntVTs[] = { MVT::i8, MVT::i16, MVT::i32, MVT::i64 };
Expand Down Expand Up @@ -505,7 +505,7 @@ X86TargetLowering::X86TargetLowering(const X86TargetMachine &TM,
setOperationAction(ISD::STACKSAVE, MVT::Other, Expand);
setOperationAction(ISD::STACKRESTORE, MVT::Other, Expand);

setOperationAction(ISD::DYNAMIC_STACKALLOC, getPointerTy(*TD), Custom);
setOperationAction(ISD::DYNAMIC_STACKALLOC, PtrVT, Custom);

// GC_TRANSITION_START and GC_TRANSITION_END need custom lowering.
setOperationAction(ISD::GC_TRANSITION_START, MVT::Other, Custom);
Expand Down Expand Up @@ -16515,9 +16515,11 @@ SDValue X86TargetLowering::LowerINIT_TRAMPOLINE(SDValue Op,

for (FunctionType::param_iterator I = FTy->param_begin(),
E = FTy->param_end(); I != E; ++I, ++Idx)
if (Attrs.hasAttribute(Idx, Attribute::InReg))
if (Attrs.hasAttribute(Idx, Attribute::InReg)) {
auto &DL = DAG.getDataLayout();
// FIXME: should only count parameters that are lowered to integers.
InRegCount += (TD->getTypeSizeInBits(*I) + 31) / 32;
InRegCount += (DL.getTypeSizeInBits(*I) + 31) / 32;
}

if (InRegCount > 2) {
report_fatal_error("Nest register in use - reduce number of inreg"
Expand Down
3 changes: 1 addition & 2 deletions tools/llc/llc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -312,8 +312,7 @@ static int compileModule(char **argv, LLVMContext &Context) {
PM.add(new TargetLibraryInfoWrapperPass(TLII));

// Add the target data from the target machine, if it exists, or the module.
if (const DataLayout *DL = Target->getDataLayout())
M->setDataLayout(*DL);
M->setDataLayout(Target->createDataLayout());

// Override function attributes based on CPUStr, FeaturesStr, and command line
// flags.
Expand Down
3 changes: 2 additions & 1 deletion tools/lli/OrcLazyJIT.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,8 @@ int llvm::runOrcLazyJIT(std::unique_ptr<Module> M, int ArgC, char* ArgV[]) {
}

// Everything looks good. Build the JIT.
OrcLazyJIT J(std::move(TM), Context, CallbackMgrBuilder);
auto &DL = M->getDataLayout();
OrcLazyJIT J(std::move(TM), DL, Context, CallbackMgrBuilder);

// Add the module, look up main and run it.
auto MainHandle = J.addModule(std::move(M));
Expand Down
26 changes: 13 additions & 13 deletions tools/lli/OrcLazyJIT.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,16 +46,17 @@ class OrcLazyJIT {
CallbackManagerBuilder;

static CallbackManagerBuilder createCallbackManagerBuilder(Triple T);

OrcLazyJIT(std::unique_ptr<TargetMachine> TM, LLVMContext &Context,
CallbackManagerBuilder &BuildCallbackMgr)
: TM(std::move(TM)),
ObjectLayer(),
CompileLayer(ObjectLayer, orc::SimpleCompiler(*this->TM)),
IRDumpLayer(CompileLayer, createDebugDumper()),
CCMgr(BuildCallbackMgr(IRDumpLayer, CCMgrMemMgr, Context)),
CODLayer(IRDumpLayer, *CCMgr, false),
CXXRuntimeOverrides([this](const std::string &S) { return mangle(S); }) {}
const DataLayout &DL;

OrcLazyJIT(std::unique_ptr<TargetMachine> TM, const DataLayout &DL,
LLVMContext &Context, CallbackManagerBuilder &BuildCallbackMgr)
: DL(DL), TM(std::move(TM)), ObjectLayer(),
CompileLayer(ObjectLayer, orc::SimpleCompiler(*this->TM)),
IRDumpLayer(CompileLayer, createDebugDumper()),
CCMgr(BuildCallbackMgr(IRDumpLayer, CCMgrMemMgr, Context)),
CODLayer(IRDumpLayer, *CCMgr, false),
CXXRuntimeOverrides(
[this](const std::string &S) { return mangle(S); }) {}

~OrcLazyJIT() {
// Run any destructors registered with __cxa_atexit.
Expand All @@ -73,7 +74,7 @@ class OrcLazyJIT {
ModuleHandleT addModule(std::unique_ptr<Module> M) {
// Attach a data-layout if one isn't already present.
if (M->getDataLayout().isDefault())
M->setDataLayout(*TM->getDataLayout());
M->setDataLayout(DL);

// Record the static constructors and destructors. We have to do this before
// we hand over ownership of the module to the JIT.
Expand Down Expand Up @@ -131,12 +132,11 @@ class OrcLazyJIT {
}

private:

std::string mangle(const std::string &Name) {
std::string MangledName;
{
raw_string_ostream MangledNameStream(MangledName);
Mangler::getNameWithPrefix(MangledNameStream, Name, *TM->getDataLayout());
Mangler::getNameWithPrefix(MangledNameStream, Name, DL);
}
return MangledName;
}
Expand Down

0 comments on commit 0f720d9

Please sign in to comment.