From: Mehdi Amini Date: Tue, 25 Aug 2015 01:21:09 +0000 (+0000) Subject: Revert "Fix LLVM C API for DataLayout" X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=commitdiff_plain;h=4bc8e7e0c1ff0b4db669c04b3e7568ff31e30fdb Revert "Fix LLVM C API for DataLayout" This reverts commit 433bfd94e4b7e3cc3f8b08f8513ce47817941b0c. Broke some bot, have to see why it passed locally. From: Mehdi Amini git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@245917 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/Target/TargetMachine.h b/include/llvm/Target/TargetMachine.h index 0060fb72caf..d707e7c0293 100644 --- a/include/llvm/Target/TargetMachine.h +++ b/include/llvm/Target/TargetMachine.h @@ -59,13 +59,6 @@ class PassManagerBase; } using legacy::PassManagerBase; -extern "C" { -// This function from the C API is deprecated. We still supports it using a -// private method on the TargetMachine for now. But it needs to be friended and -// so we forward declare it here. -LLVMTargetDataRef LLVMGetTargetMachineData(LLVMTargetMachineRef T); -} - //===----------------------------------------------------------------------===// /// /// Primary interface to the complete machine description for the target @@ -110,12 +103,6 @@ protected: // Can only create subclasses. unsigned RequireStructuredCFG : 1; - /// This API is here to support the C API, deprecated in 3.7 release. - /// This should never be used outside of legacy existing client. - const DataLayout &getDataLayout() const { return DL; } - friend struct LLVMOpaqueTargetData * ::LLVMGetTargetMachineData( - LLVMTargetMachineRef T); - public: mutable TargetOptions Options; diff --git a/lib/Target/TargetMachineC.cpp b/lib/Target/TargetMachineC.cpp index 6255448a7e3..b2bd8fae423 100644 --- a/lib/Target/TargetMachineC.cpp +++ b/lib/Target/TargetMachineC.cpp @@ -32,14 +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 Machine; + DataLayout DL; +}; + + static TargetMachine *unwrap(LLVMTargetMachineRef P) { - return reinterpret_cast(P); + return P->Machine.get(); } static Target *unwrap(LLVMTargetRef P) { return reinterpret_cast(P); } static LLVMTargetMachineRef wrap(const TargetMachine *P) { - return reinterpret_cast(const_cast(P)); + return new LLVMOpaqueTargetMachine{ std::unique_ptr(const_cast(P)), P->createDataLayout() }; } static LLVMTargetRef wrap(const Target * P) { return reinterpret_cast(const_cast(P)); @@ -68,16 +79,16 @@ LLVMTargetRef LLVMGetTargetFromName(const char *Name) { LLVMBool LLVMGetTargetFromTriple(const char* TripleStr, LLVMTargetRef *T, char **ErrorMessage) { std::string Error; - + *T = wrap(TargetRegistry::lookupTarget(TripleStr, Error)); - + if (!*T) { if (ErrorMessage) *ErrorMessage = strdup(Error.c_str()); return 1; } - + return 0; } @@ -144,7 +155,10 @@ LLVMTargetMachineRef LLVMCreateTargetMachine(LLVMTargetRef T, CM, OL)); } -void LLVMDisposeTargetMachine(LLVMTargetMachineRef T) { delete unwrap(T); } + +void LLVMDisposeTargetMachine(LLVMTargetMachineRef T) { + delete T; +} LLVMTargetRef LLVMGetTargetMachineTarget(LLVMTargetMachineRef T) { const Target* target = &(unwrap(T)->getTarget()); @@ -166,9 +180,9 @@ char* LLVMGetTargetMachineFeatureString(LLVMTargetMachineRef T) { return strdup(StringRep.c_str()); } -/** Deprecated: use LLVMGetDataLayout(LLVMModuleRef M) instead. */ +/// @deprecated: see "struct LLVMOpaqueTargetMachine" description above LLVMTargetDataRef LLVMGetTargetMachineData(LLVMTargetMachineRef T) { - return wrap(&unwrap(T)->getDataLayout()); + return wrap(&T->DL); } void LLVMSetTargetMachineAsmVerbosity(LLVMTargetMachineRef T,