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