X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FTarget%2FTargetMachineC.cpp;h=5913822de235318d628560c34e42b7167f963bff;hb=5f53aadd9c9fa073ce5eabc630002b77f9663cf9;hp=1a5bf163bd9ff8c916c0b0e2bd052865baed87cd;hpb=c98092e28db7f3def249a1bf37483b264dd46194;p=oota-llvm.git diff --git a/lib/Target/TargetMachineC.cpp b/lib/Target/TargetMachineC.cpp index 1a5bf163bd9..5913822de23 100644 --- a/lib/Target/TargetMachineC.cpp +++ b/lib/Target/TargetMachineC.cpp @@ -32,26 +32,36 @@ using namespace llvm; -inline TargetMachine *unwrap(LLVMTargetMachineRef P) { - return reinterpret_cast(P); + +// 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 Machine; + DataLayout DL; +}; + + +static TargetMachine *unwrap(LLVMTargetMachineRef P) { + return P->Machine.get(); } -inline Target *unwrap(LLVMTargetRef P) { +static Target *unwrap(LLVMTargetRef P) { return reinterpret_cast(P); } -inline LLVMTargetMachineRef wrap(const TargetMachine *P) { - return - reinterpret_cast(const_cast(P)); +static LLVMTargetMachineRef wrap(const TargetMachine *P) { + return new LLVMOpaqueTargetMachine{ std::unique_ptr(const_cast(P)), P->createDataLayout() }; } -inline LLVMTargetRef wrap(const Target * P) { +static LLVMTargetRef wrap(const Target * P) { return reinterpret_cast(const_cast(P)); } LLVMTargetRef LLVMGetFirstTarget() { - if(TargetRegistry::begin() == TargetRegistry::end()) { + if (TargetRegistry::targets().begin() == TargetRegistry::targets().end()) { return nullptr; } - const Target* target = &*TargetRegistry::begin(); + const Target *target = &*TargetRegistry::targets().begin(); return wrap(target); } LLVMTargetRef LLVMGetNextTarget(LLVMTargetRef T) { @@ -60,13 +70,10 @@ LLVMTargetRef LLVMGetNextTarget(LLVMTargetRef T) { LLVMTargetRef LLVMGetTargetFromName(const char *Name) { StringRef NameRef = Name; - for (TargetRegistry::iterator IT = TargetRegistry::begin(), - IE = TargetRegistry::end(); IT != IE; ++IT) { - if (IT->getName() == NameRef) - return wrap(&*IT); - } - - return nullptr; + auto I = std::find_if( + TargetRegistry::targets().begin(), TargetRegistry::targets().end(), + [&](const Target &T) { return T.getName() == NameRef; }); + return I != TargetRegistry::targets().end() ? wrap(&*I) : nullptr; } LLVMBool LLVMGetTargetFromTriple(const char* TripleStr, LLVMTargetRef *T, @@ -150,7 +157,7 @@ LLVMTargetMachineRef LLVMCreateTargetMachine(LLVMTargetRef T, void LLVMDisposeTargetMachine(LLVMTargetMachineRef T) { - delete unwrap(T); + delete T; } LLVMTargetRef LLVMGetTargetMachineTarget(LLVMTargetMachineRef T) { @@ -159,7 +166,7 @@ LLVMTargetRef LLVMGetTargetMachineTarget(LLVMTargetMachineRef T) { } char* LLVMGetTargetMachineTriple(LLVMTargetMachineRef T) { - std::string StringRep = unwrap(T)->getTargetTriple(); + std::string StringRep = unwrap(T)->getTargetTriple().str(); return strdup(StringRep.c_str()); } @@ -173,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, @@ -193,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) {