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