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 |
(...skipping 708 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
719 raw_os_ostream *Os = | 719 raw_os_ostream *Os = |
720 new raw_os_ostream(OutputFilename == "-" ? std::cout : Ofs); | 720 new raw_os_ostream(OutputFilename == "-" ? std::cout : Ofs); |
721 Os->SetUnbuffered(); | 721 Os->SetUnbuffered(); |
722 std::ofstream Lfs; | 722 std::ofstream Lfs; |
723 if (LogFilename != "-") { | 723 if (LogFilename != "-") { |
724 Lfs.open(LogFilename.c_str(), std::ofstream::out); | 724 Lfs.open(LogFilename.c_str(), std::ofstream::out); |
725 } | 725 } |
726 raw_os_ostream *Ls = new raw_os_ostream(LogFilename == "-" ? std::cout : Lfs); | 726 raw_os_ostream *Ls = new raw_os_ostream(LogFilename == "-" ? std::cout : Lfs); |
727 Ls->SetUnbuffered(); | 727 Ls->SetUnbuffered(); |
728 | 728 |
| 729 Ice::GlobalContext Ctx(Ls, Os, VMask, TargetArch, OptLevel, TestPrefix); |
| 730 |
| 731 Ice::TargetGlobalInitLowering *GlobalLowering = |
| 732 Ice::TargetGlobalInitLowering::createLowering(TargetArch, &Ctx); |
| 733 for (Module::const_global_iterator I = Mod->global_begin(), |
| 734 E = Mod->global_end(); |
| 735 I != E; ++I) { |
| 736 if (!I->hasInitializer()) |
| 737 continue; |
| 738 const Constant *Initializer = I->getInitializer(); |
| 739 Ice::IceString Name = I->getName(); |
| 740 unsigned Align = I->getAlignment(); |
| 741 uint64_t NumElements = 0; |
| 742 const char *Data = NULL; |
| 743 bool DeleteData = false; |
| 744 bool IsInternal = I->hasInternalLinkage(); |
| 745 bool IsConst = I->isConstant(); |
| 746 bool IsZeroInitializer = false; |
| 747 |
| 748 if (const ConstantDataArray *CDA = |
| 749 dyn_cast<ConstantDataArray>(Initializer)) { |
| 750 NumElements = CDA->getNumElements(); |
| 751 assert(isa<IntegerType>(CDA->getElementType()) && |
| 752 cast<IntegerType>(CDA->getElementType())->getBitWidth() == 8); |
| 753 Data = CDA->getRawDataValues().data(); |
| 754 } else if (isa<ConstantAggregateZero>(Initializer)) { |
| 755 if (const ArrayType *AT = dyn_cast<ArrayType>(Initializer->getType())) { |
| 756 assert(isa<IntegerType>(AT->getElementType()) && |
| 757 cast<IntegerType>(AT->getElementType())->getBitWidth() == 8); |
| 758 NumElements = AT->getNumElements(); |
| 759 char *MyData = new char[NumElements]; |
| 760 memset(MyData, 0, NumElements); |
| 761 Data = MyData; |
| 762 DeleteData = true; |
| 763 IsZeroInitializer = true; |
| 764 } else { |
| 765 llvm_unreachable("Unhandled constant aggregate zero type"); |
| 766 } |
| 767 } else { |
| 768 llvm_unreachable("Unhandled global initializer"); |
| 769 } |
| 770 |
| 771 GlobalLowering->lower(Name, Align, IsInternal, IsConst, IsZeroInitializer, |
| 772 NumElements, Data, DisableTranslation); |
| 773 if (DeleteData) |
| 774 delete Data; |
| 775 } |
| 776 delete GlobalLowering; |
| 777 |
729 // Ideally, Func would be declared inside the loop and its object | 778 // Ideally, Func would be declared inside the loop and its object |
730 // would be automatically deleted at the end of the loop iteration. | 779 // would be automatically deleted at the end of the loop iteration. |
731 // However, emitting the constant pool requires a valid Cfg object, | 780 // However, emitting the constant pool requires a valid Cfg object, |
732 // so we need to defer deleting the last non-empty Cfg object until | 781 // so we need to defer deleting the last non-empty Cfg object until |
733 // outside the loop and after emitting the constant pool. TODO: | 782 // outside the loop and after emitting the constant pool. TODO: |
734 // Since all constants are globally pooled in the Ice::GlobalContext | 783 // Since all constants are globally pooled in the Ice::GlobalContext |
735 // object, change all Ice::Constant related functions to use | 784 // object, change all Ice::Constant related functions to use |
736 // GlobalContext instead of Cfg, and then clean up this loop. | 785 // GlobalContext instead of Cfg, and then clean up this loop. |
737 OwningPtr<Ice::Cfg> Func; | 786 OwningPtr<Ice::Cfg> Func; |
738 Ice::GlobalContext Ctx(Ls, Os, VMask, TargetArch, OptLevel, TestPrefix); | |
739 | 787 |
740 for (Module::const_iterator I = Mod->begin(), E = Mod->end(); I != E; ++I) { | 788 for (Module::const_iterator I = Mod->begin(), E = Mod->end(); I != E; ++I) { |
741 if (I->empty()) | 789 if (I->empty()) |
742 continue; | 790 continue; |
743 LLVM2ICEConverter FunctionConverter(&Ctx); | 791 LLVM2ICEConverter FunctionConverter(&Ctx); |
744 | 792 |
745 Ice::Timer TConvert; | 793 Ice::Timer TConvert; |
746 Func.reset(FunctionConverter.convertFunction(I)); | 794 Func.reset(FunctionConverter.convertFunction(I)); |
747 if (DisableInternal) | 795 if (DisableInternal) |
748 Func->setInternal(false); | 796 Func->setInternal(false); |
(...skipping 27 matching lines...) Expand all Loading... |
776 << " sec\n"; | 824 << " sec\n"; |
777 } | 825 } |
778 } | 826 } |
779 } | 827 } |
780 | 828 |
781 if (!DisableTranslation && Func) | 829 if (!DisableTranslation && Func) |
782 Func->getTarget()->emitConstants(); | 830 Func->getTarget()->emitConstants(); |
783 | 831 |
784 return ExitStatus; | 832 return ExitStatus; |
785 } | 833 } |
OLD | NEW |