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 |