OLD | NEW |
1 //===- subzero/src/llvm2ice.cpp - Driver for testing ----------------------===// | 1 //===- subzero/src/llvm2ice.cpp - Driver for testing ----------------------===// |
2 // | 2 // |
3 // The Subzero Code Generator | 3 // The Subzero Code Generator |
4 // | 4 // |
5 // This file is distributed under the University of Illinois Open Source | 5 // This file is distributed under the University of Illinois Open Source |
6 // License. See LICENSE.TXT for details. | 6 // License. See LICENSE.TXT for details. |
7 // | 7 // |
8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
9 // | 9 // |
10 // This file defines a driver that uses LLVM capabilities to parse a | 10 // This file defines a driver that uses LLVM capabilities to parse a |
11 // bitcode file and build the LLVM IR, and then convert the LLVM basic | 11 // bitcode file and build the LLVM IR, and then convert the LLVM basic |
12 // blocks, instructions, and operands into their Subzero equivalents. | 12 // blocks, instructions, and operands into their Subzero equivalents. |
13 // | 13 // |
14 //===----------------------------------------------------------------------===// | 14 //===----------------------------------------------------------------------===// |
15 | 15 |
16 #include "IceCfg.h" | 16 #include "IceCfg.h" |
17 #include "IceCfgNode.h" | 17 #include "IceCfgNode.h" |
18 #include "IceDefs.h" | 18 #include "IceDefs.h" |
19 #include "IceGlobalContext.h" | 19 #include "IceGlobalContext.h" |
20 #include "IceInst.h" | 20 #include "IceInst.h" |
21 #include "IceOperand.h" | 21 #include "IceOperand.h" |
| 22 #include "IceTargetLowering.h" |
22 #include "IceTypes.h" | 23 #include "IceTypes.h" |
23 | 24 |
24 #include "llvm/IR/Constant.h" | 25 #include "llvm/IR/Constant.h" |
25 #include "llvm/IR/Constants.h" | 26 #include "llvm/IR/Constants.h" |
26 #include "llvm/IR/DataLayout.h" | 27 #include "llvm/IR/DataLayout.h" |
27 #include "llvm/IR/Instruction.h" | 28 #include "llvm/IR/Instruction.h" |
28 #include "llvm/IR/Instructions.h" | 29 #include "llvm/IR/Instructions.h" |
29 #include "llvm/IR/LLVMContext.h" | 30 #include "llvm/IR/LLVMContext.h" |
30 #include "llvm/IR/Module.h" | 31 #include "llvm/IR/Module.h" |
31 #include "llvm/IRReader/IRReader.h" | 32 #include "llvm/IRReader/IRReader.h" |
(...skipping 24 matching lines...) Expand all Loading... |
56 // | 57 // |
57 class LLVM2ICEConverter { | 58 class LLVM2ICEConverter { |
58 public: | 59 public: |
59 LLVM2ICEConverter(Ice::GlobalContext *Ctx) | 60 LLVM2ICEConverter(Ice::GlobalContext *Ctx) |
60 : Ctx(Ctx), Func(NULL), CurrentNode(NULL) { | 61 : Ctx(Ctx), Func(NULL), CurrentNode(NULL) { |
61 // All PNaCl pointer widths are 32 bits because of the sandbox | 62 // All PNaCl pointer widths are 32 bits because of the sandbox |
62 // model. | 63 // model. |
63 SubzeroPointerType = Ice::IceType_i32; | 64 SubzeroPointerType = Ice::IceType_i32; |
64 } | 65 } |
65 | 66 |
| 67 // Caller is expected to delete the returned Ice::Cfg object. |
66 Ice::Cfg *convertFunction(const Function *F) { | 68 Ice::Cfg *convertFunction(const Function *F) { |
67 VarMap.clear(); | 69 VarMap.clear(); |
68 NodeMap.clear(); | 70 NodeMap.clear(); |
69 Func = new Ice::Cfg(Ctx); | 71 Func = new Ice::Cfg(Ctx); |
70 Func->setFunctionName(F->getName()); | 72 Func->setFunctionName(F->getName()); |
71 Func->setReturnType(convertType(F->getReturnType())); | 73 Func->setReturnType(convertType(F->getReturnType())); |
72 Func->setInternal(F->hasInternalLinkage()); | 74 Func->setInternal(F->hasInternalLinkage()); |
73 | 75 |
74 // The initial definition/use of each arg is the entry node. | 76 // The initial definition/use of each arg is the entry node. |
75 CurrentNode = mapBasicBlockToNode(&F->getEntryBlock()); | 77 CurrentNode = mapBasicBlockToNode(&F->getEntryBlock()); |
(...skipping 535 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
611 cl::init(""), cl::value_desc("prefix")); | 613 cl::init(""), cl::value_desc("prefix")); |
612 static cl::opt<bool> | 614 static cl::opt<bool> |
613 DisableInternal("external", | 615 DisableInternal("external", |
614 cl::desc("Disable 'internal' linkage type for testing")); | 616 cl::desc("Disable 'internal' linkage type for testing")); |
615 static cl::opt<bool> | 617 static cl::opt<bool> |
616 DisableTranslation("notranslate", cl::desc("Disable Subzero translation")); | 618 DisableTranslation("notranslate", cl::desc("Disable Subzero translation")); |
617 | 619 |
618 static cl::opt<bool> SubzeroTimingEnabled( | 620 static cl::opt<bool> SubzeroTimingEnabled( |
619 "timing", cl::desc("Enable breakdown timing of Subzero translation")); | 621 "timing", cl::desc("Enable breakdown timing of Subzero translation")); |
620 | 622 |
621 static cl::opt<NaClFileFormat> | 623 static cl::opt<NaClFileFormat> InputFileFormat( |
622 InputFileFormat( | 624 "bitcode-format", cl::desc("Define format of input file:"), |
623 "bitcode-format", | 625 cl::values(clEnumValN(LLVMFormat, "llvm", "LLVM file (default)"), |
624 cl::desc("Define format of input file:"), | 626 clEnumValN(PNaClFormat, "pnacl", "PNaCl bitcode file"), |
625 cl::values( | 627 clEnumValEnd), |
626 clEnumValN(LLVMFormat, "llvm", "LLVM file (default)"), | |
627 clEnumValN(PNaClFormat, "pnacl", "PNaCl bitcode file"), | |
628 clEnumValEnd), | |
629 cl::init(LLVMFormat)); | 628 cl::init(LLVMFormat)); |
630 | 629 |
631 int main(int argc, char **argv) { | 630 int main(int argc, char **argv) { |
632 int ExitStatus = 0; | 631 int ExitStatus = 0; |
633 | 632 |
634 cl::ParseCommandLineOptions(argc, argv); | 633 cl::ParseCommandLineOptions(argc, argv); |
635 | 634 |
636 // Parse the input LLVM IR file into a module. | 635 // Parse the input LLVM IR file into a module. |
637 SMDiagnostic Err; | 636 SMDiagnostic Err; |
638 Module *Mod; | 637 Module *Mod; |
(...skipping 24 matching lines...) Expand all Loading... |
663 raw_os_ostream *Os = | 662 raw_os_ostream *Os = |
664 new raw_os_ostream(OutputFilename == "-" ? std::cout : Ofs); | 663 new raw_os_ostream(OutputFilename == "-" ? std::cout : Ofs); |
665 Os->SetUnbuffered(); | 664 Os->SetUnbuffered(); |
666 std::ofstream Lfs; | 665 std::ofstream Lfs; |
667 if (LogFilename != "-") { | 666 if (LogFilename != "-") { |
668 Lfs.open(LogFilename.c_str(), std::ofstream::out); | 667 Lfs.open(LogFilename.c_str(), std::ofstream::out); |
669 } | 668 } |
670 raw_os_ostream *Ls = new raw_os_ostream(LogFilename == "-" ? std::cout : Lfs); | 669 raw_os_ostream *Ls = new raw_os_ostream(LogFilename == "-" ? std::cout : Lfs); |
671 Ls->SetUnbuffered(); | 670 Ls->SetUnbuffered(); |
672 | 671 |
| 672 // Ideally, Func would be declared inside the loop and its object |
| 673 // would be automatically deleted at the end of the loop iteration. |
| 674 // However, emitting the constant pool requires a valid Cfg object, |
| 675 // so we need to defer deleting the last non-empty Cfg object until |
| 676 // outside the loop and after emitting the constant pool. TODO: |
| 677 // Since all constants are globally pooled in the Ice::GlobalContext |
| 678 // object, change all Ice::Constant related functions to use |
| 679 // GlobalContext instead of Cfg, and then clean up this loop. |
| 680 OwningPtr<Ice::Cfg> Func; |
673 Ice::GlobalContext Ctx(Ls, Os, VMask, TargetArch, OptLevel, TestPrefix); | 681 Ice::GlobalContext Ctx(Ls, Os, VMask, TargetArch, OptLevel, TestPrefix); |
674 | 682 |
675 for (Module::const_iterator I = Mod->begin(), E = Mod->end(); I != E; ++I) { | 683 for (Module::const_iterator I = Mod->begin(), E = Mod->end(); I != E; ++I) { |
676 if (I->empty()) | 684 if (I->empty()) |
677 continue; | 685 continue; |
678 LLVM2ICEConverter FunctionConverter(&Ctx); | 686 LLVM2ICEConverter FunctionConverter(&Ctx); |
679 | 687 |
680 Ice::Timer TConvert; | 688 Ice::Timer TConvert; |
681 Ice::Cfg *Func = FunctionConverter.convertFunction(I); | 689 Func.reset(FunctionConverter.convertFunction(I)); |
682 if (DisableInternal) | 690 if (DisableInternal) |
683 Func->setInternal(false); | 691 Func->setInternal(false); |
684 | 692 |
685 if (SubzeroTimingEnabled) { | 693 if (SubzeroTimingEnabled) { |
686 std::cerr << "[Subzero timing] Convert function " | 694 std::cerr << "[Subzero timing] Convert function " |
687 << Func->getFunctionName() << ": " << TConvert.getElapsedSec() | 695 << Func->getFunctionName() << ": " << TConvert.getElapsedSec() |
688 << " sec\n"; | 696 << " sec\n"; |
689 } | 697 } |
690 | 698 |
691 if (DisableTranslation) { | 699 if (DisableTranslation) { |
(...skipping 14 matching lines...) Expand all Loading... |
706 Ice::Timer TEmit; | 714 Ice::Timer TEmit; |
707 Func->emit(); | 715 Func->emit(); |
708 if (SubzeroTimingEnabled) { | 716 if (SubzeroTimingEnabled) { |
709 std::cerr << "[Subzero timing] Emit function " | 717 std::cerr << "[Subzero timing] Emit function " |
710 << Func->getFunctionName() << ": " << TEmit.getElapsedSec() | 718 << Func->getFunctionName() << ": " << TEmit.getElapsedSec() |
711 << " sec\n"; | 719 << " sec\n"; |
712 } | 720 } |
713 } | 721 } |
714 } | 722 } |
715 | 723 |
| 724 if (!DisableTranslation && Func) |
| 725 Func->getTarget()->emitConstants(); |
| 726 |
716 return ExitStatus; | 727 return ExitStatus; |
717 } | 728 } |
OLD | NEW |