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" 21dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "llvm/Support/FileSystem.h" 22d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Support/FormattedStream.h" 2336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Support/Host.h" 24d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Support/TargetRegistry.h" 25d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Support/raw_ostream.h" 26d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Target/TargetMachine.h" 27d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands#include <cassert> 28d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands#include <cstdlib> 29d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands#include <cstring> 30d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 31d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sandsusing namespace llvm; 32d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 333e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopherinline TargetMachine *unwrap(LLVMTargetMachineRef P) { 343e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopher return reinterpret_cast<TargetMachine*>(P); 353e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopher} 363e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopherinline Target *unwrap(LLVMTargetRef P) { 373e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopher return reinterpret_cast<Target*>(P); 383e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopher} 393e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopherinline LLVMTargetMachineRef wrap(const TargetMachine *P) { 403e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopher return 413e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopher reinterpret_cast<LLVMTargetMachineRef>(const_cast<TargetMachine*>(P)); 423e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopher} 433e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopherinline LLVMTargetRef wrap(const Target * P) { 443e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopher return reinterpret_cast<LLVMTargetRef>(const_cast<Target*>(P)); 453e39731e88f2d4f597cebc74388fd6650ca4f604Eric Christopher} 46d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 47d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan SandsLLVMTargetRef LLVMGetFirstTarget() { 482fee43f9b210859f46fdb279baabb96a61a774afAnders Waldenborg if(TargetRegistry::begin() == TargetRegistry::end()) { 49dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 502fee43f9b210859f46fdb279baabb96a61a774afAnders Waldenborg } 512fee43f9b210859f46fdb279baabb96a61a774afAnders Waldenborg 522fee43f9b210859f46fdb279baabb96a61a774afAnders Waldenborg const Target* target = &*TargetRegistry::begin(); 532fee43f9b210859f46fdb279baabb96a61a774afAnders Waldenborg return wrap(target); 54d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands} 55d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan SandsLLVMTargetRef LLVMGetNextTarget(LLVMTargetRef T) { 56d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands return wrap(unwrap(T)->getNext()); 57d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands} 58d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 595ea0c20ce7a161d23a9bf8f1beea0ffb6a02898cPeter ZotovLLVMTargetRef LLVMGetTargetFromName(const char *Name) { 60e016a163e97d29a4c343189e678633066a3365abPeter Zotov StringRef NameRef = Name; 611acb2127bad420af19a5929df54a892957ba3c13Peter Zotov for (TargetRegistry::iterator IT = TargetRegistry::begin(), 621acb2127bad420af19a5929df54a892957ba3c13Peter Zotov IE = TargetRegistry::end(); IT != IE; ++IT) { 63e016a163e97d29a4c343189e678633066a3365abPeter Zotov if (IT->getName() == NameRef) 645ea0c20ce7a161d23a9bf8f1beea0ffb6a02898cPeter Zotov return wrap(&*IT); 651acb2127bad420af19a5929df54a892957ba3c13Peter Zotov } 661acb2127bad420af19a5929df54a892957ba3c13Peter Zotov 67dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return nullptr; 681acb2127bad420af19a5929df54a892957ba3c13Peter Zotov} 691acb2127bad420af19a5929df54a892957ba3c13Peter Zotov 701acb2127bad420af19a5929df54a892957ba3c13Peter ZotovLLVMBool LLVMGetTargetFromTriple(const char* TripleStr, LLVMTargetRef *T, 711acb2127bad420af19a5929df54a892957ba3c13Peter Zotov char **ErrorMessage) { 721acb2127bad420af19a5929df54a892957ba3c13Peter Zotov std::string Error; 731acb2127bad420af19a5929df54a892957ba3c13Peter Zotov 741acb2127bad420af19a5929df54a892957ba3c13Peter Zotov *T = wrap(TargetRegistry::lookupTarget(TripleStr, Error)); 751acb2127bad420af19a5929df54a892957ba3c13Peter Zotov 761acb2127bad420af19a5929df54a892957ba3c13Peter Zotov if (!*T) { 771acb2127bad420af19a5929df54a892957ba3c13Peter Zotov if (ErrorMessage) 781acb2127bad420af19a5929df54a892957ba3c13Peter Zotov *ErrorMessage = strdup(Error.c_str()); 791acb2127bad420af19a5929df54a892957ba3c13Peter Zotov 801acb2127bad420af19a5929df54a892957ba3c13Peter Zotov return 1; 811acb2127bad420af19a5929df54a892957ba3c13Peter Zotov } 821acb2127bad420af19a5929df54a892957ba3c13Peter Zotov 831acb2127bad420af19a5929df54a892957ba3c13Peter Zotov return 0; 841acb2127bad420af19a5929df54a892957ba3c13Peter Zotov} 851acb2127bad420af19a5929df54a892957ba3c13Peter Zotov 86d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sandsconst char * LLVMGetTargetName(LLVMTargetRef T) { 87d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands return unwrap(T)->getName(); 88d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands} 89d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 90d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sandsconst char * LLVMGetTargetDescription(LLVMTargetRef T) { 91d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands return unwrap(T)->getShortDescription(); 92d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands} 93d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 94d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan SandsLLVMBool LLVMTargetHasJIT(LLVMTargetRef T) { 95d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands return unwrap(T)->hasJIT(); 96d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands} 97d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 98d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan SandsLLVMBool LLVMTargetHasTargetMachine(LLVMTargetRef T) { 99d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands return unwrap(T)->hasTargetMachine(); 100d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands} 101d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 102d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan SandsLLVMBool LLVMTargetHasAsmBackend(LLVMTargetRef T) { 103d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands return unwrap(T)->hasMCAsmBackend(); 104d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands} 105d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 106fa74752298602e0b74fb60ce3f0e76d0c461d3d8Peter ZotovLLVMTargetMachineRef LLVMCreateTargetMachine(LLVMTargetRef T, 107fa74752298602e0b74fb60ce3f0e76d0c461d3d8Peter Zotov const char* Triple, const char* CPU, const char* Features, 108fa74752298602e0b74fb60ce3f0e76d0c461d3d8Peter Zotov LLVMCodeGenOptLevel Level, LLVMRelocMode Reloc, 109fa74752298602e0b74fb60ce3f0e76d0c461d3d8Peter Zotov LLVMCodeModel CodeModel) { 110d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands Reloc::Model RM; 111d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands switch (Reloc){ 112d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands case LLVMRelocStatic: 113d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands RM = Reloc::Static; 114d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands break; 115d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands case LLVMRelocPIC: 116d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands RM = Reloc::PIC_; 117d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands break; 118d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands case LLVMRelocDynamicNoPic: 119d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands RM = Reloc::DynamicNoPIC; 120d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands break; 121d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands default: 122d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands RM = Reloc::Default; 123d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands break; 124d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands } 125d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 1260e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo CodeModel::Model CM = unwrap(CodeModel); 127d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 1280e1327e4aa1426aaa3f99a2cbfcb1f2b575791adFilip Pizlo CodeGenOpt::Level OL; 129d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands switch (Level) { 130d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands case LLVMCodeGenLevelNone: 131d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands OL = CodeGenOpt::None; 132d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands break; 133d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands case LLVMCodeGenLevelLess: 134d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands OL = CodeGenOpt::Less; 135d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands break; 136d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands case LLVMCodeGenLevelAggressive: 137d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands OL = CodeGenOpt::Aggressive; 138d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands break; 139d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands default: 140d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands OL = CodeGenOpt::Default; 141d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands break; 142d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands } 143d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 144d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands TargetOptions opt; 145d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands return wrap(unwrap(T)->createTargetMachine(Triple, CPU, Features, opt, RM, 146d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands CM, OL)); 147d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands} 148d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 149d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 150d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sandsvoid LLVMDisposeTargetMachine(LLVMTargetMachineRef T) { 151d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands delete unwrap(T); 152d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands} 153d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 154d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan SandsLLVMTargetRef LLVMGetTargetMachineTarget(LLVMTargetMachineRef T) { 155d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands const Target* target = &(unwrap(T)->getTarget()); 156d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands return wrap(target); 157d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands} 158d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 159d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sandschar* LLVMGetTargetMachineTriple(LLVMTargetMachineRef T) { 160d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands std::string StringRep = unwrap(T)->getTargetTriple(); 161d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands return strdup(StringRep.c_str()); 162d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands} 163d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 164d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sandschar* LLVMGetTargetMachineCPU(LLVMTargetMachineRef T) { 165d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands std::string StringRep = unwrap(T)->getTargetCPU(); 166d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands return strdup(StringRep.c_str()); 167d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands} 168d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 169d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sandschar* LLVMGetTargetMachineFeatureString(LLVMTargetMachineRef T) { 170d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands std::string StringRep = unwrap(T)->getTargetFeatureString(); 171d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands return strdup(StringRep.c_str()); 172d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands} 173d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 174d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan SandsLLVMTargetDataRef LLVMGetTargetMachineData(LLVMTargetMachineRef T) { 1753574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmow return wrap(unwrap(T)->getDataLayout()); 176d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands} 177d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 1781acb2127bad420af19a5929df54a892957ba3c13Peter Zotovvoid LLVMSetTargetMachineAsmVerbosity(LLVMTargetMachineRef T, 1791acb2127bad420af19a5929df54a892957ba3c13Peter Zotov LLVMBool VerboseAsm) { 1801acb2127bad420af19a5929df54a892957ba3c13Peter Zotov unwrap(T)->setAsmVerbosityDefault(VerboseAsm); 1811acb2127bad420af19a5929df54a892957ba3c13Peter Zotov} 1821acb2127bad420af19a5929df54a892957ba3c13Peter Zotov 183ad74f335ef06fa3f6bb64120f8c6bb57a517ee58Tom Stellardstatic LLVMBool LLVMTargetMachineEmit(LLVMTargetMachineRef T, LLVMModuleRef M, 184ad74f335ef06fa3f6bb64120f8c6bb57a517ee58Tom Stellard formatted_raw_ostream &OS, LLVMCodeGenFileType codegen, char **ErrorMessage) { 185d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands TargetMachine* TM = unwrap(T); 186d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands Module* Mod = unwrap(M); 187d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 188d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands PassManager pass; 189d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 190d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands std::string error; 191d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 1923574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmow const DataLayout* td = TM->getDataLayout(); 193d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 194d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands if (!td) { 1953574eca1b02600bac4e625297f4ecf745f4c4f32Micah Villmow error = "No DataLayout in TargetMachine"; 196d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands *ErrorMessage = strdup(error.c_str()); 197d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands return true; 198d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands } 19936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Mod->setDataLayout(td); 20036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines pass.add(new DataLayoutPass(Mod)); 201d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 202d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands TargetMachine::CodeGenFileType ft; 203d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands switch (codegen) { 204d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands case LLVMAssemblyFile: 205d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands ft = TargetMachine::CGFT_AssemblyFile; 206d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands break; 207d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands default: 208d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands ft = TargetMachine::CGFT_ObjectFile; 209d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands break; 210d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands } 211ad74f335ef06fa3f6bb64120f8c6bb57a517ee58Tom Stellard if (TM->addPassesToEmitFile(pass, OS, ft)) { 212f3a64c00c189c1961a49aed9ce6f21e133bdde03Nick Lewycky error = "TargetMachine can't emit a file of this type"; 213d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands *ErrorMessage = strdup(error.c_str()); 214d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands return true; 215d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands } 216d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 217d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands pass.run(*Mod); 218d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands 219ad74f335ef06fa3f6bb64120f8c6bb57a517ee58Tom Stellard OS.flush(); 220d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands return false; 221d6b7b8f49b0554b82165ecef07de7e9c0c5eeb42Duncan Sands} 222ad74f335ef06fa3f6bb64120f8c6bb57a517ee58Tom Stellard 223ad74f335ef06fa3f6bb64120f8c6bb57a517ee58Tom StellardLLVMBool LLVMTargetMachineEmitToFile(LLVMTargetMachineRef T, LLVMModuleRef M, 224ad74f335ef06fa3f6bb64120f8c6bb57a517ee58Tom Stellard char* Filename, LLVMCodeGenFileType codegen, char** ErrorMessage) { 225ad74f335ef06fa3f6bb64120f8c6bb57a517ee58Tom Stellard std::string error; 22636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines raw_fd_ostream dest(Filename, error, sys::fs::F_None); 227ad74f335ef06fa3f6bb64120f8c6bb57a517ee58Tom Stellard if (!error.empty()) { 228ad74f335ef06fa3f6bb64120f8c6bb57a517ee58Tom Stellard *ErrorMessage = strdup(error.c_str()); 229ad74f335ef06fa3f6bb64120f8c6bb57a517ee58Tom Stellard return true; 230ad74f335ef06fa3f6bb64120f8c6bb57a517ee58Tom Stellard } 2310738387d089d56d0be3a25d5a02bc6609a88bebfAnders Waldenborg formatted_raw_ostream destf(dest); 232ad74f335ef06fa3f6bb64120f8c6bb57a517ee58Tom Stellard bool Result = LLVMTargetMachineEmit(T, M, destf, codegen, ErrorMessage); 233ad74f335ef06fa3f6bb64120f8c6bb57a517ee58Tom Stellard dest.flush(); 234ad74f335ef06fa3f6bb64120f8c6bb57a517ee58Tom Stellard return Result; 235ad74f335ef06fa3f6bb64120f8c6bb57a517ee58Tom Stellard} 236ad74f335ef06fa3f6bb64120f8c6bb57a517ee58Tom Stellard 237ad74f335ef06fa3f6bb64120f8c6bb57a517ee58Tom StellardLLVMBool LLVMTargetMachineEmitToMemoryBuffer(LLVMTargetMachineRef T, 238ad74f335ef06fa3f6bb64120f8c6bb57a517ee58Tom Stellard LLVMModuleRef M, LLVMCodeGenFileType codegen, char** ErrorMessage, 239ad74f335ef06fa3f6bb64120f8c6bb57a517ee58Tom Stellard LLVMMemoryBufferRef *OutMemBuf) { 240ad74f335ef06fa3f6bb64120f8c6bb57a517ee58Tom Stellard std::string CodeString; 241ad74f335ef06fa3f6bb64120f8c6bb57a517ee58Tom Stellard raw_string_ostream OStream(CodeString); 242ad74f335ef06fa3f6bb64120f8c6bb57a517ee58Tom Stellard formatted_raw_ostream Out(OStream); 243ad74f335ef06fa3f6bb64120f8c6bb57a517ee58Tom Stellard bool Result = LLVMTargetMachineEmit(T, M, Out, codegen, ErrorMessage); 244ad74f335ef06fa3f6bb64120f8c6bb57a517ee58Tom Stellard OStream.flush(); 245ad74f335ef06fa3f6bb64120f8c6bb57a517ee58Tom Stellard 246ad74f335ef06fa3f6bb64120f8c6bb57a517ee58Tom Stellard std::string &Data = OStream.str(); 247ad74f335ef06fa3f6bb64120f8c6bb57a517ee58Tom Stellard *OutMemBuf = LLVMCreateMemoryBufferWithMemoryRangeCopy(Data.c_str(), 248ad74f335ef06fa3f6bb64120f8c6bb57a517ee58Tom Stellard Data.length(), ""); 249ad74f335ef06fa3f6bb64120f8c6bb57a517ee58Tom Stellard return Result; 250ad74f335ef06fa3f6bb64120f8c6bb57a517ee58Tom Stellard} 2511acb2127bad420af19a5929df54a892957ba3c13Peter Zotov 2521acb2127bad420af19a5929df54a892957ba3c13Peter Zotovchar *LLVMGetDefaultTargetTriple(void) { 2531acb2127bad420af19a5929df54a892957ba3c13Peter Zotov return strdup(sys::getDefaultTargetTriple().c_str()); 2541acb2127bad420af19a5929df54a892957ba3c13Peter Zotov} 25536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 25636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesvoid LLVMAddAnalysisPasses(LLVMTargetMachineRef T, LLVMPassManagerRef PM) { 25736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unwrap(T)->addAnalysisPasses(*unwrap(PM)); 25836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines} 259