| OLD | NEW |
| 1 //===- subzero/src/IceTargetLowering.cpp - Basic lowering implementation --===// | 1 //===- subzero/src/IceTargetLowering.cpp - Basic lowering implementation --===// |
| 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 /// \file | 10 /// \file |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 99 TargetLowering *TargetLowering::createLowering(TargetArch Target, Cfg *Func) { | 99 TargetLowering *TargetLowering::createLowering(TargetArch Target, Cfg *Func) { |
| 100 #define SUBZERO_TARGET(X) \ | 100 #define SUBZERO_TARGET(X) \ |
| 101 if (Target == Target_##X) \ | 101 if (Target == Target_##X) \ |
| 102 return Target##X::create(Func); | 102 return Target##X::create(Func); |
| 103 #include "llvm/Config/SZTargets.def" | 103 #include "llvm/Config/SZTargets.def" |
| 104 | 104 |
| 105 Func->setError("Unsupported target"); | 105 Func->setError("Unsupported target"); |
| 106 return nullptr; | 106 return nullptr; |
| 107 } | 107 } |
| 108 | 108 |
| 109 void TargetLowering::staticInit(TargetArch Target) { | 109 void TargetLowering::staticInit(const ClFlags &Flags) { |
| 110 const TargetArch Target = Flags.getTargetArch(); |
| 110 // Call the specified target's static initializer. | 111 // Call the specified target's static initializer. |
| 111 switch (Target) { | 112 switch (Target) { |
| 112 default: | 113 default: |
| 113 llvm::report_fatal_error("Unsupported target"); | 114 llvm::report_fatal_error("Unsupported target"); |
| 114 break; | 115 break; |
| 115 #define SUBZERO_TARGET(X) \ | 116 #define SUBZERO_TARGET(X) \ |
| 116 case Target_##X: { \ | 117 case Target_##X: { \ |
| 117 static bool InitGuard##X = false; \ | 118 static bool InitGuard##X = false; \ |
| 118 if (InitGuard##X) \ | 119 if (InitGuard##X) \ |
| 119 return; \ | 120 return; \ |
| 120 InitGuard##X = true; \ | 121 InitGuard##X = true; \ |
| 121 Target##X::staticInit(); \ | 122 Target##X::staticInit(Flags); \ |
| 122 } break; | 123 } break; |
| 123 #include "llvm/Config/SZTargets.def" | 124 #include "llvm/Config/SZTargets.def" |
| 124 } | 125 } |
| 125 } | 126 } |
| 126 | 127 |
| 127 TargetLowering::TargetLowering(Cfg *Func) | 128 TargetLowering::TargetLowering(Cfg *Func) |
| 128 : Func(Func), Ctx(Func->getContext()), Context() {} | 129 : Func(Func), Ctx(Func->getContext()), Context() {} |
| 129 | 130 |
| 130 std::unique_ptr<Assembler> TargetLowering::createAssembler(TargetArch Target, | 131 std::unique_ptr<Assembler> TargetLowering::createAssembler(TargetArch Target, |
| 131 Cfg *Func) { | 132 Cfg *Func) { |
| (...skipping 373 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 505 InstCall *Call = | 506 InstCall *Call = |
| 506 InstCall::create(Func, MaxSrcs, Dest, CallTarget, HasTailCall); | 507 InstCall::create(Func, MaxSrcs, Dest, CallTarget, HasTailCall); |
| 507 return Call; | 508 return Call; |
| 508 } | 509 } |
| 509 | 510 |
| 510 bool TargetLowering::shouldOptimizeMemIntrins() { | 511 bool TargetLowering::shouldOptimizeMemIntrins() { |
| 511 return Ctx->getFlags().getOptLevel() >= Opt_1 || | 512 return Ctx->getFlags().getOptLevel() >= Opt_1 || |
| 512 Ctx->getFlags().getForceMemIntrinOpt(); | 513 Ctx->getFlags().getForceMemIntrinOpt(); |
| 513 } | 514 } |
| 514 | 515 |
| 515 void TargetLowering::emitWithoutPrefix(const ConstantRelocatable *C) const { | 516 void TargetLowering::emitWithoutPrefix(const ConstantRelocatable *C, |
| 517 const char *Suffix) const { |
| 516 if (!BuildDefs::dump()) | 518 if (!BuildDefs::dump()) |
| 517 return; | 519 return; |
| 518 Ostream &Str = Ctx->getStrEmit(); | 520 Ostream &Str = Ctx->getStrEmit(); |
| 519 if (C->getSuppressMangling()) | 521 if (C->getSuppressMangling()) |
| 520 Str << C->getName(); | 522 Str << C->getName(); |
| 521 else | 523 else |
| 522 Str << Ctx->mangleName(C->getName()); | 524 Str << Ctx->mangleName(C->getName()); |
| 525 Str << Suffix; |
| 523 RelocOffsetT Offset = C->getOffset(); | 526 RelocOffsetT Offset = C->getOffset(); |
| 524 if (Offset) { | 527 if (Offset) { |
| 525 if (Offset > 0) | 528 if (Offset > 0) |
| 526 Str << "+"; | 529 Str << "+"; |
| 527 Str << Offset; | 530 Str << Offset; |
| 528 } | 531 } |
| 529 } | 532 } |
| 530 | 533 |
| 531 void TargetLowering::emit(const ConstantRelocatable *C) const { | |
| 532 if (!BuildDefs::dump()) | |
| 533 return; | |
| 534 Ostream &Str = Ctx->getStrEmit(); | |
| 535 Str << getConstantPrefix(); | |
| 536 emitWithoutPrefix(C); | |
| 537 } | |
| 538 | |
| 539 std::unique_ptr<TargetDataLowering> | 534 std::unique_ptr<TargetDataLowering> |
| 540 TargetDataLowering::createLowering(GlobalContext *Ctx) { | 535 TargetDataLowering::createLowering(GlobalContext *Ctx) { |
| 541 TargetArch Target = Ctx->getFlags().getTargetArch(); | 536 TargetArch Target = Ctx->getFlags().getTargetArch(); |
| 542 #define SUBZERO_TARGET(X) \ | 537 #define SUBZERO_TARGET(X) \ |
| 543 if (Target == Target_##X) \ | 538 if (Target == Target_##X) \ |
| 544 return TargetData##X::create(Ctx); | 539 return TargetData##X::create(Ctx); |
| 545 #include "llvm/Config/SZTargets.def" | 540 #include "llvm/Config/SZTargets.def" |
| 546 | 541 |
| 547 llvm::report_fatal_error("Unsupported target data lowering"); | 542 llvm::report_fatal_error("Unsupported target data lowering"); |
| 548 } | 543 } |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 586 | 581 |
| 587 Ostream &Str = Ctx->getStrEmit(); | 582 Ostream &Str = Ctx->getStrEmit(); |
| 588 const bool HasNonzeroInitializer = Var.hasNonzeroInitializer(); | 583 const bool HasNonzeroInitializer = Var.hasNonzeroInitializer(); |
| 589 const bool IsConstant = Var.getIsConstant(); | 584 const bool IsConstant = Var.getIsConstant(); |
| 590 const SizeT Size = Var.getNumBytes(); | 585 const SizeT Size = Var.getNumBytes(); |
| 591 const IceString MangledName = Var.mangleName(Ctx); | 586 const IceString MangledName = Var.mangleName(Ctx); |
| 592 | 587 |
| 593 Str << "\t.type\t" << MangledName << ",%object\n"; | 588 Str << "\t.type\t" << MangledName << ",%object\n"; |
| 594 | 589 |
| 595 const bool UseDataSections = Ctx->getFlags().getDataSections(); | 590 const bool UseDataSections = Ctx->getFlags().getDataSections(); |
| 591 const bool UseNonsfi = Ctx->getFlags().getUseNonsfi(); |
| 596 const IceString Suffix = | 592 const IceString Suffix = |
| 597 dataSectionSuffix(SectionSuffix, MangledName, UseDataSections); | 593 dataSectionSuffix(SectionSuffix, MangledName, UseDataSections); |
| 598 if (IsConstant) | 594 if (IsConstant && UseNonsfi) |
| 595 Str << "\t.section\t.data.rel.ro" << Suffix << ",\"aw\",%progbits\n"; |
| 596 else if (IsConstant) |
| 599 Str << "\t.section\t.rodata" << Suffix << ",\"a\",%progbits\n"; | 597 Str << "\t.section\t.rodata" << Suffix << ",\"a\",%progbits\n"; |
| 600 else if (HasNonzeroInitializer) | 598 else if (HasNonzeroInitializer) |
| 601 Str << "\t.section\t.data" << Suffix << ",\"aw\",%progbits\n"; | 599 Str << "\t.section\t.data" << Suffix << ",\"aw\",%progbits\n"; |
| 602 else | 600 else |
| 603 Str << "\t.section\t.bss" << Suffix << ",\"aw\",%nobits\n"; | 601 Str << "\t.section\t.bss" << Suffix << ",\"aw\",%nobits\n"; |
| 604 | 602 |
| 605 if (IsExternal) | 603 if (IsExternal) |
| 606 Str << "\t.globl\t" << MangledName << "\n"; | 604 Str << "\t.globl\t" << MangledName << "\n"; |
| 607 | 605 |
| 608 const uint32_t Align = Var.getAlignment(); | 606 const uint32_t Align = Var.getAlignment(); |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 665 if (Target == Target_##X) \ | 663 if (Target == Target_##X) \ |
| 666 return TargetHeader##X::create(Ctx); | 664 return TargetHeader##X::create(Ctx); |
| 667 #include "llvm/Config/SZTargets.def" | 665 #include "llvm/Config/SZTargets.def" |
| 668 | 666 |
| 669 llvm::report_fatal_error("Unsupported target header lowering"); | 667 llvm::report_fatal_error("Unsupported target header lowering"); |
| 670 } | 668 } |
| 671 | 669 |
| 672 TargetHeaderLowering::~TargetHeaderLowering() = default; | 670 TargetHeaderLowering::~TargetHeaderLowering() = default; |
| 673 | 671 |
| 674 } // end of namespace Ice | 672 } // end of namespace Ice |
| OLD | NEW |