TargetMachineC.cpp revision 36b56886974eae4f9c5ebc96befd3e7bfe5de338
1d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands//===-- TargetMachine.cpp -------------------------------------------------===// 2d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands// 3d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands// The LLVM Compiler Infrastructure 4d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands// 5d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands// This file is distributed under the University of Illinois Open Source 6d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands// License. See LICENSE.TXT for details. 7d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands// 8d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands//===----------------------------------------------------------------------===// 9d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands// 10d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands// This file implements the LLVM-C part of TargetMachine.h 11d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands// 12d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands//===----------------------------------------------------------------------===// 13d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 14d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm-c/TargetMachine.h" 15d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands#include "llvm-c/Core.h" 16d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands#include "llvm-c/Target.h" 170b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/DataLayout.h" 180b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Module.h" 19d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands#include "llvm/PassManager.h" 20d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Support/CodeGen.h" 21d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Support/FormattedStream.h" 2236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Support/Host.h" 23d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Support/TargetRegistry.h" 24d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Support/raw_ostream.h" 25d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/TargetMachine.h" 26d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands#include <cassert> 27d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands#include <cstdlib> 28d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands#include <cstring> 29d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 30d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sandsusing namespace llvm; 31d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 323e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopherinline DataLayout *unwrap(LLVMTargetDataRef P) { 333e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopher return reinterpret_cast<DataLayout*>(P); 343e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopher} 353e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopher 363e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopherinline LLVMTargetDataRef wrap(const DataLayout *P) { 373e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopher return reinterpret_cast<LLVMTargetDataRef>(const_cast<DataLayout*>(P)); 383e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopher} 39d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 403e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopherinline TargetLibraryInfo *unwrap(LLVMTargetLibraryInfoRef P) { 413e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopher return reinterpret_cast<TargetLibraryInfo*>(P); 423e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopher} 433e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopher 443e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopherinline LLVMTargetLibraryInfoRef wrap(const TargetLibraryInfo *P) { 453e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopher TargetLibraryInfo *X = const_cast<TargetLibraryInfo*>(P); 463e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopher return reinterpret_cast<LLVMTargetLibraryInfoRef>(X); 473e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopher} 483e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopher 493e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopherinline TargetMachine *unwrap(LLVMTargetMachineRef P) { 503e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopher return reinterpret_cast<TargetMachine*>(P); 513e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopher} 523e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopherinline Target *unwrap(LLVMTargetRef P) { 533e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopher return reinterpret_cast<Target*>(P); 543e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopher} 553e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopherinline LLVMTargetMachineRef wrap(const TargetMachine *P) { 563e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopher return 573e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopher reinterpret_cast<LLVMTargetMachineRef>(const_cast<TargetMachine*>(P)); 583e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopher} 593e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopherinline LLVMTargetRef wrap(const Target * P) { 603e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopher return reinterpret_cast<LLVMTargetRef>(const_cast<Target*>(P)); 613e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopher} 62d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 63d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan SandsLLVMTargetRef LLVMGetFirstTarget() { 642fee43f9b210859f46fdb279baabb96a61a774afAnders Waldenborg if(TargetRegistry::begin() == TargetRegistry::end()) { 652fee43f9b210859f46fdb279baabb96a61a774afAnders Waldenborg return NULL; 662fee43f9b210859f46fdb279baabb96a61a774afAnders Waldenborg } 672fee43f9b210859f46fdb279baabb96a61a774afAnders Waldenborg 682fee43f9b210859f46fdb279baabb96a61a774afAnders Waldenborg const Target* target = &*TargetRegistry::begin(); 692fee43f9b210859f46fdb279baabb96a61a774afAnders Waldenborg return wrap(target); 70d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands} 71d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan SandsLLVMTargetRef LLVMGetNextTarget(LLVMTargetRef T) { 72d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands return wrap(unwrap(T)->getNext()); 73d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands} 74d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 755ea0c20ce7a161d23a9bf8f1beea0ffb6a02898cPeter ZotovLLVMTargetRef LLVMGetTargetFromName(const char *Name) { 76e016a163e97d29a4c343189e678633066a3365abPeter Zotov StringRef NameRef = Name; 771acb2127bad420af19a5929df54a892957ba3c13Peter Zotov for (TargetRegistry::iterator IT = TargetRegistry::begin(), 781acb2127bad420af19a5929df54a892957ba3c13Peter Zotov IE = TargetRegistry::end(); IT != IE; ++IT) { 79e016a163e97d29a4c343189e678633066a3365abPeter Zotov if (IT->getName() == NameRef) 805ea0c20ce7a161d23a9bf8f1beea0ffb6a02898cPeter Zotov return wrap(&*IT); 811acb2127bad420af19a5929df54a892957ba3c13Peter Zotov } 821acb2127bad420af19a5929df54a892957ba3c13Peter Zotov 835ea0c20ce7a161d23a9bf8f1beea0ffb6a02898cPeter Zotov return NULL; 841acb2127bad420af19a5929df54a892957ba3c13Peter Zotov} 851acb2127bad420af19a5929df54a892957ba3c13Peter Zotov 861acb2127bad420af19a5929df54a892957ba3c13Peter ZotovLLVMBool LLVMGetTargetFromTriple(const char* TripleStr, LLVMTargetRef *T, 871acb2127bad420af19a5929df54a892957ba3c13Peter Zotov char **ErrorMessage) { 881acb2127bad420af19a5929df54a892957ba3c13Peter Zotov std::string Error; 891acb2127bad420af19a5929df54a892957ba3c13Peter Zotov 901acb2127bad420af19a5929df54a892957ba3c13Peter Zotov *T = wrap(TargetRegistry::lookupTarget(TripleStr, Error)); 911acb2127bad420af19a5929df54a892957ba3c13Peter Zotov 921acb2127bad420af19a5929df54a892957ba3c13Peter Zotov if (!*T) { 931acb2127bad420af19a5929df54a892957ba3c13Peter Zotov if (ErrorMessage) 941acb2127bad420af19a5929df54a892957ba3c13Peter Zotov *ErrorMessage = strdup(Error.c_str()); 951acb2127bad420af19a5929df54a892957ba3c13Peter Zotov 961acb2127bad420af19a5929df54a892957ba3c13Peter Zotov return 1; 971acb2127bad420af19a5929df54a892957ba3c13Peter Zotov } 981acb2127bad420af19a5929df54a892957ba3c13Peter Zotov 991acb2127bad420af19a5929df54a892957ba3c13Peter Zotov return 0; 1001acb2127bad420af19a5929df54a892957ba3c13Peter Zotov} 1011acb2127bad420af19a5929df54a892957ba3c13Peter Zotov 102d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sandsconst char * LLVMGetTargetName(LLVMTargetRef T) { 103d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands return unwrap(T)->getName(); 104d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands} 105d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 106d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sandsconst char * LLVMGetTargetDescription(LLVMTargetRef T) { 107d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands return unwrap(T)->getShortDescription(); 108d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands} 109d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 110d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan SandsLLVMBool LLVMTargetHasJIT(LLVMTargetRef T) { 111d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands return unwrap(T)->hasJIT(); 112d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands} 113d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 114d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan SandsLLVMBool LLVMTargetHasTargetMachine(LLVMTargetRef T) { 115d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands return unwrap(T)->hasTargetMachine(); 116d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands} 117d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 118d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan SandsLLVMBool LLVMTargetHasAsmBackend(LLVMTargetRef T) { 119d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands return unwrap(T)->hasMCAsmBackend(); 120d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands} 121d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 122fa74752298602e0b74fb60ce3f0e76d0c461d3d8Peter ZotovLLVMTargetMachineRef LLVMCreateTargetMachine(LLVMTargetRef T, 123fa74752298602e0b74fb60ce3f0e76d0c461d3d8Peter Zotov const char* Triple, const char* CPU, const char* Features, 124fa74752298602e0b74fb60ce3f0e76d0c461d3d8Peter Zotov LLVMCodeGenOptLevel Level, LLVMRelocMode Reloc, 125fa74752298602e0b74fb60ce3f0e76d0c461d3d8Peter Zotov LLVMCodeModel CodeModel) { 126d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands Reloc::Model RM; 127d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands switch (Reloc){ 128d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands case LLVMRelocStatic: 129d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands RM = Reloc::Static; 130d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands break; 131d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands case LLVMRelocPIC: 132d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands RM = Reloc::PIC_; 133d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands break; 134d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands case LLVMRelocDynamicNoPic: 135d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands RM = Reloc::DynamicNoPIC; 136d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands break; 137d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands default: 138d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands RM = Reloc::Default; 139d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands break; 140d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands } 141d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 1420e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo CodeModel::Model CM = unwrap(CodeModel); 143d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 1440e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo CodeGenOpt::Level OL; 145d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands switch (Level) { 146d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands case LLVMCodeGenLevelNone: 147d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands OL = CodeGenOpt::None; 148d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands break; 149d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands case LLVMCodeGenLevelLess: 150d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands OL = CodeGenOpt::Less; 151d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands break; 152d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands case LLVMCodeGenLevelAggressive: 153d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands OL = CodeGenOpt::Aggressive; 154d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands break; 155d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands default: 156d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands OL = CodeGenOpt::Default; 157d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands break; 158d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands } 159d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 160d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands TargetOptions opt; 161d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands return wrap(unwrap(T)->createTargetMachine(Triple, CPU, Features, opt, RM, 162d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands CM, OL)); 163d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands} 164d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 165d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 166d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sandsvoid LLVMDisposeTargetMachine(LLVMTargetMachineRef T) { 167d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands delete unwrap(T); 168d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands} 169d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 170d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan SandsLLVMTargetRef LLVMGetTargetMachineTarget(LLVMTargetMachineRef T) { 171d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands const Target* target = &(unwrap(T)->getTarget()); 172d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands return wrap(target); 173d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands} 174d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 175d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sandschar* LLVMGetTargetMachineTriple(LLVMTargetMachineRef T) { 176d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands std::string StringRep = unwrap(T)->getTargetTriple(); 177d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands return strdup(StringRep.c_str()); 178d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands} 179d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 180d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sandschar* LLVMGetTargetMachineCPU(LLVMTargetMachineRef T) { 181d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands std::string StringRep = unwrap(T)->getTargetCPU(); 182d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands return strdup(StringRep.c_str()); 183d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands} 184d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 185d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sandschar* LLVMGetTargetMachineFeatureString(LLVMTargetMachineRef T) { 186d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands std::string StringRep = unwrap(T)->getTargetFeatureString(); 187d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands return strdup(StringRep.c_str()); 188d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands} 189d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 190d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan SandsLLVMTargetDataRef LLVMGetTargetMachineData(LLVMTargetMachineRef T) { 1913574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmow return wrap(unwrap(T)->getDataLayout()); 192d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands} 193d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 1941acb2127bad420af19a5929df54a892957ba3c13Peter Zotovvoid LLVMSetTargetMachineAsmVerbosity(LLVMTargetMachineRef T, 1951acb2127bad420af19a5929df54a892957ba3c13Peter Zotov LLVMBool VerboseAsm) { 1961acb2127bad420af19a5929df54a892957ba3c13Peter Zotov unwrap(T)->setAsmVerbosityDefault(VerboseAsm); 1971acb2127bad420af19a5929df54a892957ba3c13Peter Zotov} 1981acb2127bad420af19a5929df54a892957ba3c13Peter Zotov 199ad74f335ef06fa3f6bb64120f8c6bb57a517ee58Tom Stellardstatic LLVMBool LLVMTargetMachineEmit(LLVMTargetMachineRef T, LLVMModuleRef M, 200ad74f335ef06fa3f6bb64120f8c6bb57a517ee58Tom Stellard formatted_raw_ostream &OS, LLVMCodeGenFileType codegen, char **ErrorMessage) { 201d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands TargetMachine* TM = unwrap(T); 202d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands Module* Mod = unwrap(M); 203d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 204d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands PassManager pass; 205d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 206d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands std::string error; 207d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 2083574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmow const DataLayout* td = TM->getDataLayout(); 209d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 210d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands if (!td) { 2113574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmow error = "No DataLayout in TargetMachine"; 212d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands *ErrorMessage = strdup(error.c_str()); 213d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands return true; 214d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands } 21536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Mod->setDataLayout(td); 21636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines pass.add(new DataLayoutPass(Mod)); 217d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 218d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands TargetMachine::CodeGenFileType ft; 219d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands switch (codegen) { 220d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands case LLVMAssemblyFile: 221d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands ft = TargetMachine::CGFT_AssemblyFile; 222d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands break; 223d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands default: 224d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands ft = TargetMachine::CGFT_ObjectFile; 225d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands break; 226d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands } 227ad74f335ef06fa3f6bb64120f8c6bb57a517ee58Tom Stellard if (TM->addPassesToEmitFile(pass, OS, ft)) { 228f3a64c00c189c1961a49aed9ce6f21e133bdde03Nick Lewycky error = "TargetMachine can't emit a file of this type"; 229d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands *ErrorMessage = strdup(error.c_str()); 230d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands return true; 231d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands } 232d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 233d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands pass.run(*Mod); 234d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 235ad74f335ef06fa3f6bb64120f8c6bb57a517ee58Tom Stellard OS.flush(); 236d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands return false; 237d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands} 238ad74f335ef06fa3f6bb64120f8c6bb57a517ee58Tom Stellard 239ad74f335ef06fa3f6bb64120f8c6bb57a517ee58Tom StellardLLVMBool LLVMTargetMachineEmitToFile(LLVMTargetMachineRef T, LLVMModuleRef M, 240ad74f335ef06fa3f6bb64120f8c6bb57a517ee58Tom Stellard char* Filename, LLVMCodeGenFileType codegen, char** ErrorMessage) { 241ad74f335ef06fa3f6bb64120f8c6bb57a517ee58Tom Stellard std::string error; 24236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines raw_fd_ostream dest(Filename, error, sys::fs::F_None); 243ad74f335ef06fa3f6bb64120f8c6bb57a517ee58Tom Stellard if (!error.empty()) { 244ad74f335ef06fa3f6bb64120f8c6bb57a517ee58Tom Stellard *ErrorMessage = strdup(error.c_str()); 245ad74f335ef06fa3f6bb64120f8c6bb57a517ee58Tom Stellard return true; 246ad74f335ef06fa3f6bb64120f8c6bb57a517ee58Tom Stellard } 2470738387d089d56d0be3a25d5a02bc6609a88bebfAnders Waldenborg formatted_raw_ostream destf(dest); 248ad74f335ef06fa3f6bb64120f8c6bb57a517ee58Tom Stellard bool Result = LLVMTargetMachineEmit(T, M, destf, codegen, ErrorMessage); 249ad74f335ef06fa3f6bb64120f8c6bb57a517ee58Tom Stellard dest.flush(); 250ad74f335ef06fa3f6bb64120f8c6bb57a517ee58Tom Stellard return Result; 251ad74f335ef06fa3f6bb64120f8c6bb57a517ee58Tom Stellard} 252ad74f335ef06fa3f6bb64120f8c6bb57a517ee58Tom Stellard 253ad74f335ef06fa3f6bb64120f8c6bb57a517ee58Tom StellardLLVMBool LLVMTargetMachineEmitToMemoryBuffer(LLVMTargetMachineRef T, 254ad74f335ef06fa3f6bb64120f8c6bb57a517ee58Tom Stellard LLVMModuleRef M, LLVMCodeGenFileType codegen, char** ErrorMessage, 255ad74f335ef06fa3f6bb64120f8c6bb57a517ee58Tom Stellard LLVMMemoryBufferRef *OutMemBuf) { 256ad74f335ef06fa3f6bb64120f8c6bb57a517ee58Tom Stellard std::string CodeString; 257ad74f335ef06fa3f6bb64120f8c6bb57a517ee58Tom Stellard raw_string_ostream OStream(CodeString); 258ad74f335ef06fa3f6bb64120f8c6bb57a517ee58Tom Stellard formatted_raw_ostream Out(OStream); 259ad74f335ef06fa3f6bb64120f8c6bb57a517ee58Tom Stellard bool Result = LLVMTargetMachineEmit(T, M, Out, codegen, ErrorMessage); 260ad74f335ef06fa3f6bb64120f8c6bb57a517ee58Tom Stellard OStream.flush(); 261ad74f335ef06fa3f6bb64120f8c6bb57a517ee58Tom Stellard 262ad74f335ef06fa3f6bb64120f8c6bb57a517ee58Tom Stellard std::string &Data = OStream.str(); 263ad74f335ef06fa3f6bb64120f8c6bb57a517ee58Tom Stellard *OutMemBuf = LLVMCreateMemoryBufferWithMemoryRangeCopy(Data.c_str(), 264ad74f335ef06fa3f6bb64120f8c6bb57a517ee58Tom Stellard Data.length(), ""); 265ad74f335ef06fa3f6bb64120f8c6bb57a517ee58Tom Stellard return Result; 266ad74f335ef06fa3f6bb64120f8c6bb57a517ee58Tom Stellard} 2671acb2127bad420af19a5929df54a892957ba3c13Peter Zotov 2681acb2127bad420af19a5929df54a892957ba3c13Peter Zotovchar *LLVMGetDefaultTargetTriple(void) { 2691acb2127bad420af19a5929df54a892957ba3c13Peter Zotov return strdup(sys::getDefaultTargetTriple().c_str()); 2701acb2127bad420af19a5929df54a892957ba3c13Peter Zotov} 27136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 27236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid LLVMAddAnalysisPasses(LLVMTargetMachineRef T, LLVMPassManagerRef PM) { 27336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unwrap(T)->addAnalysisPasses(*unwrap(PM)); 27436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 275