Changeset 699:ed9a9e6dd1cc
- Timestamp:
- 10/13/08 11:28:39
(3 months ago)
- Author:
- Tomas Lindquist Olsen <tomas.l.olsen@gmail.com>
- branch:
- default
- Message:
Started changing target triple stuff, part of fixing #97
-
Files:
-
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
| r695 |
r699 |
|
| 830 | 830 | global.params.is64bit = false; |
|---|
| 831 | 831 | global.params.cpu = ARCHx86; |
|---|
| 832 | | global.params.tt_arch = "i686"; |
|---|
| 833 | | global.params.data_layout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-f80:32:32-v64:64:64-v128:128:128-a0:0:64"; |
|---|
| | 832 | //global.params.data_layout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-f80:32:32-v64:64:64-v128:128:128-a0:0:64"; |
|---|
| 834 | 833 | if (global.params.useInlineAsm) { |
|---|
| 835 | 834 | VersionCondition::addPredefinedGlobalIdent("LLVM_InlineAsm_X86"); |
|---|
| … | … | |
| 841 | 840 | global.params.is64bit = true; |
|---|
| 842 | 841 | global.params.cpu = ARCHx86_64; |
|---|
| 843 | | global.params.tt_arch = "x86_64"; |
|---|
| 844 | | global.params.data_layout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64"; |
|---|
| | 842 | //global.params.data_layout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64"; |
|---|
| 845 | 843 | } |
|---|
| 846 | 844 | else if (strcmp(global.params.llvmArch,"ppc32")==0) { |
|---|
| … | … | |
| 849 | 847 | global.params.is64bit = false; |
|---|
| 850 | 848 | global.params.cpu = ARCHppc; |
|---|
| 851 | | global.params.tt_arch = "powerpc"; |
|---|
| 852 | | global.params.data_layout = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64"; |
|---|
| | 849 | //global.params.data_layout = "E-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64"; |
|---|
| 853 | 850 | } |
|---|
| 854 | 851 | else if (strcmp(global.params.llvmArch,"ppc64")==0) { |
|---|
| … | … | |
| 857 | 854 | global.params.is64bit = true; |
|---|
| 858 | 855 | global.params.cpu = ARCHppc_64; |
|---|
| 859 | | global.params.tt_arch = "powerpc64"; |
|---|
| 860 | | global.params.data_layout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64"; |
|---|
| | 856 | //global.params.data_layout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64"; |
|---|
| 861 | 857 | } |
|---|
| 862 | 858 | else { |
|---|
| … | … | |
| 889 | 885 | VersionCondition::addPredefinedGlobalIdent("Win32"); |
|---|
| 890 | 886 | VersionCondition::addPredefinedGlobalIdent("mingw32"); |
|---|
| 891 | | global.params.tt_os = "-pc-mingw32"; |
|---|
| 892 | 887 | break; |
|---|
| 893 | 888 | |
|---|
| … | … | |
| 895 | 890 | VersionCondition::addPredefinedGlobalIdent("linux"); |
|---|
| 896 | 891 | VersionCondition::addPredefinedGlobalIdent("Posix"); |
|---|
| 897 | | global.params.tt_os = "-pc-linux-gnu"; |
|---|
| 898 | 892 | break; |
|---|
| 899 | 893 | |
|---|
| … | … | |
| 901 | 895 | VersionCondition::addPredefinedGlobalIdent("darwin"); |
|---|
| 902 | 896 | VersionCondition::addPredefinedGlobalIdent("Posix"); |
|---|
| 903 | | global.params.tt_os = "-pc-darwin-gnu"; |
|---|
| 904 | 897 | break; |
|---|
| 905 | 898 | |
|---|
| … | … | |
| 913 | 906 | } |
|---|
| 914 | 907 | |
|---|
| | 908 | if (!global.params.targetTriple) |
|---|
| | 909 | global.params.targetTriple = DEFAULT_TARGET_TRIPLE; |
|---|
| | 910 | |
|---|
| | 911 | Logger::println("Target triple: %s", global.params.targetTriple); |
|---|
| 915 | 912 | |
|---|
| 916 | 913 | // Initialization |
|---|
| r694 |
r699 |
|
| 143 | 143 | char *llvmArch; |
|---|
| 144 | 144 | char forceBE; |
|---|
| 145 | | char *tt_arch; |
|---|
| 146 | | char *tt_os; |
|---|
| 147 | | char *data_layout; |
|---|
| 148 | 145 | char output_ll; |
|---|
| 149 | 146 | char output_bc; |
|---|
| … | … | |
| 155 | 152 | char fqnNames; // use fully qualified object names |
|---|
| 156 | 153 | char noDefaultLib; |
|---|
| | 154 | |
|---|
| | 155 | // target stuff |
|---|
| | 156 | char *targetTriple; |
|---|
| 157 | 157 | }; |
|---|
| 158 | 158 | |
|---|
| r682 |
r699 |
|
| 472 | 472 | return newlen; |
|---|
| 473 | 473 | } |
|---|
| | 474 | else if (e1->op == TOKslice && !ismemset && |
|---|
| | 475 | (e2->op == TOKadd || e2->op == TOKmin || |
|---|
| | 476 | e2->op == TOKmul || e2->op == TOKdiv || |
|---|
| | 477 | e2->op == TOKmod || e2->op == TOKxor || |
|---|
| | 478 | e2->op == TOKand || e2->op == TOKor || |
|---|
| | 479 | e2->op == TOKtilde || e2->op == TOKneg)) |
|---|
| | 480 | { |
|---|
| | 481 | assert(0 && "array op assignment is TODO"); |
|---|
| | 482 | } |
|---|
| 474 | 483 | |
|---|
| 475 | 484 | Logger::println("performing normal assignment"); |
|---|
| … | … | |
| 482 | 491 | return l; |
|---|
| 483 | 492 | |
|---|
| 484 | | #if 0 |
|---|
| 485 | | if (type->toBasetype()->ty == Tstruct && e2->type->isintegral()) |
|---|
| 486 | | { |
|---|
| 487 | | // handle struct = 0; |
|---|
| 488 | | return l; |
|---|
| 489 | | } |
|---|
| 490 | | else |
|---|
| 491 | | { |
|---|
| 492 | | return r; |
|---|
| 493 | | } |
|---|
| 494 | | #else |
|---|
| 495 | 493 | return r; |
|---|
| 496 | | #endif |
|---|
| 497 | 494 | } |
|---|
| 498 | 495 | |
|---|
| r694 |
r699 |
|
| 60 | 60 | |
|---|
| 61 | 61 | // fwd decl |
|---|
| 62 | | void write_asm_to_file(llvm::Module& m, llvm::raw_fd_ostream& Out); |
|---|
| | 62 | void write_asm_to_file(llvm::TargetMachine &Target, llvm::Module& m, llvm::raw_fd_ostream& Out); |
|---|
| 63 | 63 | void assemble(const llvm::sys::Path& asmpath, const llvm::sys::Path& objpath, char** envp); |
|---|
| 64 | 64 | |
|---|
| … | … | |
| 103 | 103 | |
|---|
| 104 | 104 | // set target stuff |
|---|
| 105 | | std::string target_triple(global.params.tt_arch); |
|---|
| 106 | | target_triple.append(global.params.tt_os); |
|---|
| 107 | | ir.module->setTargetTriple(target_triple); |
|---|
| 108 | | ir.module->setDataLayout(global.params.data_layout); |
|---|
| 109 | | |
|---|
| 110 | | gTargetData = new llvm::TargetData(global.params.data_layout); |
|---|
| | 105 | |
|---|
| | 106 | ir.module->setTargetTriple(global.params.targetTriple); |
|---|
| | 107 | |
|---|
| | 108 | // get the target machine |
|---|
| | 109 | const llvm::TargetMachineRegistry::entry* MArch; |
|---|
| | 110 | |
|---|
| | 111 | std::string Err; |
|---|
| | 112 | MArch = llvm::TargetMachineRegistry::getClosestStaticTargetForModule(*ir.module, Err); |
|---|
| | 113 | if (MArch == 0) { |
|---|
| | 114 | error("error auto-selecting target for module '%s'", Err.c_str()); |
|---|
| | 115 | fatal(); |
|---|
| | 116 | } |
|---|
| | 117 | |
|---|
| | 118 | llvm::SubtargetFeatures Features; |
|---|
| | 119 | //TODO: Features? |
|---|
| | 120 | // Features.setCPU(MCPU); |
|---|
| | 121 | // for (unsigned i = 0; i != MAttrs.size(); ++i) |
|---|
| | 122 | // Features.AddFeature(MAttrs[i]); |
|---|
| | 123 | |
|---|
| | 124 | // only generate PIC code when -fPIC switch is used |
|---|
| | 125 | if (global.params.pic) |
|---|
| | 126 | llvm::TargetMachine::setRelocationModel(llvm::Reloc::PIC_); |
|---|
| | 127 | |
|---|
| | 128 | // allocate the target machine |
|---|
| | 129 | std::auto_ptr<llvm::TargetMachine> target(MArch->CtorFn(*ir.module, Features.getString())); |
|---|
| | 130 | assert(target.get() && "Could not allocate target machine!"); |
|---|
| | 131 | llvm::TargetMachine &Target = *target.get(); |
|---|
| | 132 | |
|---|
| | 133 | gTargetData = Target.getTargetData(); |
|---|
| | 134 | ir.module->setDataLayout(gTargetData->getStringRepresentation()); |
|---|
| 111 | 135 | |
|---|
| 112 | 136 | // debug info |
|---|
| … | … | |
| 223 | 247 | { |
|---|
| 224 | 248 | llvm::raw_fd_ostream out(spath.c_str(), err); |
|---|
| 225 | | write_asm_to_file(*ir.module, out); |
|---|
| | 249 | write_asm_to_file(Target, *ir.module, out); |
|---|
| 226 | 250 | } |
|---|
| 227 | 251 | |
|---|
| … | … | |
| 252 | 276 | |
|---|
| 253 | 277 | // based on llc code, University of Illinois Open Source License |
|---|
| 254 | | void write_asm_to_file(llvm::Module& m, llvm::raw_fd_ostream& out) |
|---|
| | 278 | void write_asm_to_file(llvm::TargetMachine &Target, llvm::Module& m, llvm::raw_fd_ostream& out) |
|---|
| 255 | 279 | { |
|---|
| 256 | 280 | using namespace llvm; |
|---|
| 257 | | |
|---|
| 258 | | std::string Err; |
|---|
| 259 | | |
|---|
| 260 | | const TargetMachineRegistry::entry* MArch; |
|---|
| 261 | | MArch = TargetMachineRegistry::getClosestStaticTargetForModule(m, Err); |
|---|
| 262 | | if (MArch == 0) { |
|---|
| 263 | | error("error auto-selecting target for module '%s'", Err.c_str()); |
|---|
| 264 | | fatal(); |
|---|
| 265 | | } |
|---|
| 266 | | |
|---|
| 267 | | SubtargetFeatures Features; |
|---|
| 268 | | //TODO: Features? |
|---|
| 269 | | // Features.setCPU(MCPU); |
|---|
| 270 | | // for (unsigned i = 0; i != MAttrs.size(); ++i) |
|---|
| 271 | | // Features.AddFeature(MAttrs[i]); |
|---|
| 272 | | |
|---|
| 273 | | //FIXME: Only set this if required? |
|---|
| 274 | | TargetMachine::setRelocationModel(Reloc::PIC_); |
|---|
| 275 | | |
|---|
| 276 | | std::auto_ptr<TargetMachine> target(MArch->CtorFn(m, Features.getString())); |
|---|
| 277 | | assert(target.get() && "Could not allocate target machine!"); |
|---|
| 278 | | TargetMachine &Target = *target.get(); |
|---|
| 279 | 281 | |
|---|
| 280 | 282 | // Build up all of the passes that we want to do to the module. |
|---|
| 281 | 283 | ExistingModuleProvider Provider(&m); |
|---|
| 282 | 284 | FunctionPassManager Passes(&Provider); |
|---|
| 283 | | //FIXME: Will gTargetData always be Target.getTargetData anyway? |
|---|
| 284 | | assert(gTargetData->getStringRepresentation() == Target.getTargetData()->getStringRepresentation()); |
|---|
| | 285 | |
|---|
| 285 | 286 | Passes.add(new TargetData(*Target.getTargetData())); |
|---|
| 286 | 287 | |
|---|
| … | … | |
| 306 | 307 | |
|---|
| 307 | 308 | // release module from module provider so we can delete it ourselves |
|---|
| | 309 | std::string Err; |
|---|
| 308 | 310 | llvm::Module* rmod = Provider.releaseModule(&Err); |
|---|
| 309 | 311 | assert(rmod); |
|---|
| r673 |
r699 |
|
| 20 | 20 | if OS == "windows" then |
|---|
| 21 | 21 | POSIX = 0 |
|---|
| | 22 | end |
|---|
| | 23 | |
|---|
| | 24 | |
|---|
| | 25 | -- guess the host machine description |
|---|
| | 26 | -- also allow overriding it |
|---|
| | 27 | |
|---|
| | 28 | addoption("target-override", "Override the default target machine"); |
|---|
| | 29 | |
|---|
| | 30 | TRIPLE = ""; |
|---|
| | 31 | if options["target-override"] then |
|---|
| | 32 | TRIPLE = options["target-override"] |
|---|
| | 33 | else |
|---|
| | 34 | local p = io.popen("./config.guess") |
|---|
| | 35 | TRIPLE = p:read() |
|---|
| 22 | 36 | end |
|---|
| 23 | 37 | |
|---|
| … | … | |
| 66 | 80 | "DMDV1="..DMDV1, |
|---|
| 67 | 81 | "POSIX="..POSIX, |
|---|
| | 82 | "DEFAULT_TARGET_TRIPLE=\\\""..TRIPLE.."\\\"", |
|---|
| 68 | 83 | } |
|---|
| 69 | 84 | package.config.Release.defines = { "LLVMD_NO_LOGGER" } |
|---|