OLD | NEW |
1 //===- subzero/src/IceTargetLoweringARM32.cpp - ARM32 lowering ------------===// | 1 //===- subzero/src/IceTargetLoweringARM32.cpp - ARM32 lowering ------------===// |
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 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
43 std::unique_ptr<::Ice::TargetDataLowering> | 43 std::unique_ptr<::Ice::TargetDataLowering> |
44 createTargetDataLowering(::Ice::GlobalContext *Ctx) { | 44 createTargetDataLowering(::Ice::GlobalContext *Ctx) { |
45 return ::Ice::ARM32::TargetDataARM32::create(Ctx); | 45 return ::Ice::ARM32::TargetDataARM32::create(Ctx); |
46 } | 46 } |
47 | 47 |
48 std::unique_ptr<::Ice::TargetHeaderLowering> | 48 std::unique_ptr<::Ice::TargetHeaderLowering> |
49 createTargetHeaderLowering(::Ice::GlobalContext *Ctx) { | 49 createTargetHeaderLowering(::Ice::GlobalContext *Ctx) { |
50 return ::Ice::ARM32::TargetHeaderARM32::create(Ctx); | 50 return ::Ice::ARM32::TargetHeaderARM32::create(Ctx); |
51 } | 51 } |
52 | 52 |
53 void staticInit() { ::Ice::ARM32::TargetARM32::staticInit(); } | 53 void staticInit(const ::Ice::ClFlags &Flags) { |
| 54 ::Ice::ARM32::TargetARM32::staticInit(Flags); |
| 55 } |
54 } // end of namespace ARM32 | 56 } // end of namespace ARM32 |
55 | 57 |
56 namespace Ice { | 58 namespace Ice { |
57 namespace ARM32 { | 59 namespace ARM32 { |
58 | 60 |
59 // Defines the RegARM32::Table table with register information. | 61 // Defines the RegARM32::Table table with register information. |
60 constexpr RegARM32::TableType RegARM32::Table[]; | 62 constexpr RegARM32::TableType RegARM32::Table[]; |
61 | 63 |
62 namespace { | 64 namespace { |
63 | 65 |
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
226 REGARM32_VEC128_TABLE | 228 REGARM32_VEC128_TABLE |
227 #undef X | 229 #undef X |
228 ; | 230 ; |
229 std::array<uint32_t, NumVec128Args> Vec128ArgInitializer; | 231 std::array<uint32_t, NumVec128Args> Vec128ArgInitializer; |
230 } // end of anonymous namespace | 232 } // end of anonymous namespace |
231 | 233 |
232 TargetARM32::TargetARM32(Cfg *Func) | 234 TargetARM32::TargetARM32(Cfg *Func) |
233 : TargetLowering(Func), NeedSandboxing(Ctx->getFlags().getUseSandboxing()), | 235 : TargetLowering(Func), NeedSandboxing(Ctx->getFlags().getUseSandboxing()), |
234 CPUFeatures(Func->getContext()->getFlags()) {} | 236 CPUFeatures(Func->getContext()->getFlags()) {} |
235 | 237 |
236 void TargetARM32::staticInit() { | 238 void TargetARM32::staticInit(const ClFlags &Flags) { |
| 239 (void)Flags; |
237 // Limit this size (or do all bitsets need to be the same width)??? | 240 // Limit this size (or do all bitsets need to be the same width)??? |
238 llvm::SmallBitVector IntegerRegisters(RegARM32::Reg_NUM); | 241 llvm::SmallBitVector IntegerRegisters(RegARM32::Reg_NUM); |
239 llvm::SmallBitVector I64PairRegisters(RegARM32::Reg_NUM); | 242 llvm::SmallBitVector I64PairRegisters(RegARM32::Reg_NUM); |
240 llvm::SmallBitVector Float32Registers(RegARM32::Reg_NUM); | 243 llvm::SmallBitVector Float32Registers(RegARM32::Reg_NUM); |
241 llvm::SmallBitVector Float64Registers(RegARM32::Reg_NUM); | 244 llvm::SmallBitVector Float64Registers(RegARM32::Reg_NUM); |
242 llvm::SmallBitVector VectorRegisters(RegARM32::Reg_NUM); | 245 llvm::SmallBitVector VectorRegisters(RegARM32::Reg_NUM); |
243 llvm::SmallBitVector InvalidRegisters(RegARM32::Reg_NUM); | 246 llvm::SmallBitVector InvalidRegisters(RegARM32::Reg_NUM); |
244 ScratchRegs.resize(RegARM32::Reg_NUM); | 247 ScratchRegs.resize(RegARM32::Reg_NUM); |
245 for (int i = 0; i < RegARM32::Reg_NUM; ++i) { | 248 for (int i = 0; i < RegARM32::Reg_NUM; ++i) { |
246 const auto &Entry = RegARM32::Table[i]; | 249 const auto &Entry = RegARM32::Table[i]; |
(...skipping 643 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
890 } | 893 } |
891 assert(!Var->isRematerializable()); | 894 assert(!Var->isRematerializable()); |
892 int32_t Offset = Var->getStackOffset(); | 895 int32_t Offset = Var->getStackOffset(); |
893 int32_t BaseRegNum = Var->getBaseRegNum(); | 896 int32_t BaseRegNum = Var->getBaseRegNum(); |
894 if (BaseRegNum == Variable::NoRegister) { | 897 if (BaseRegNum == Variable::NoRegister) { |
895 BaseRegNum = getFrameOrStackReg(); | 898 BaseRegNum = getFrameOrStackReg(); |
896 } | 899 } |
897 const Type VarTy = Var->getType(); | 900 const Type VarTy = Var->getType(); |
898 Str << "[" << getRegName(BaseRegNum, VarTy); | 901 Str << "[" << getRegName(BaseRegNum, VarTy); |
899 if (Offset != 0) { | 902 if (Offset != 0) { |
900 Str << ", " << getConstantPrefix() << Offset; | 903 Str << ", #" << Offset; |
901 } | 904 } |
902 Str << "]"; | 905 Str << "]"; |
903 } | 906 } |
904 | 907 |
905 TargetARM32::CallingConv::CallingConv() | 908 TargetARM32::CallingConv::CallingConv() |
906 : GPRegsUsed(RegARM32::Reg_NUM), | 909 : GPRegsUsed(RegARM32::Reg_NUM), |
907 GPRArgs(GPRArgInitializer.rbegin(), GPRArgInitializer.rend()), | 910 GPRArgs(GPRArgInitializer.rbegin(), GPRArgInitializer.rend()), |
908 I64Args(I64ArgInitializer.rbegin(), I64ArgInitializer.rend()), | 911 I64Args(I64ArgInitializer.rbegin(), I64ArgInitializer.rend()), |
909 VFPRegsUsed(RegARM32::Reg_NUM), | 912 VFPRegsUsed(RegARM32::Reg_NUM), |
910 FP32Args(FP32ArgInitializer.rbegin(), FP32ArgInitializer.rend()), | 913 FP32Args(FP32ArgInitializer.rbegin(), FP32ArgInitializer.rend()), |
(...skipping 4788 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5699 (void)Permutation; | 5702 (void)Permutation; |
5700 (void)ExcludeRegisters; | 5703 (void)ExcludeRegisters; |
5701 (void)Salt; | 5704 (void)Salt; |
5702 UnimplementedError(Func->getContext()->getFlags()); | 5705 UnimplementedError(Func->getContext()->getFlags()); |
5703 } | 5706 } |
5704 | 5707 |
5705 void TargetARM32::emit(const ConstantInteger32 *C) const { | 5708 void TargetARM32::emit(const ConstantInteger32 *C) const { |
5706 if (!BuildDefs::dump()) | 5709 if (!BuildDefs::dump()) |
5707 return; | 5710 return; |
5708 Ostream &Str = Ctx->getStrEmit(); | 5711 Ostream &Str = Ctx->getStrEmit(); |
5709 Str << getConstantPrefix() << C->getValue(); | 5712 Str << "#" << C->getValue(); |
5710 } | 5713 } |
5711 | 5714 |
5712 void TargetARM32::emit(const ConstantInteger64 *) const { | 5715 void TargetARM32::emit(const ConstantInteger64 *) const { |
5713 llvm::report_fatal_error("Not expecting to emit 64-bit integers"); | 5716 llvm::report_fatal_error("Not expecting to emit 64-bit integers"); |
5714 } | 5717 } |
5715 | 5718 |
5716 void TargetARM32::emit(const ConstantFloat *C) const { | 5719 void TargetARM32::emit(const ConstantFloat *C) const { |
5717 (void)C; | 5720 (void)C; |
5718 UnimplementedError(Ctx->getFlags()); | 5721 UnimplementedError(Ctx->getFlags()); |
5719 } | 5722 } |
5720 | 5723 |
5721 void TargetARM32::emit(const ConstantDouble *C) const { | 5724 void TargetARM32::emit(const ConstantDouble *C) const { |
5722 (void)C; | 5725 (void)C; |
5723 UnimplementedError(Ctx->getFlags()); | 5726 UnimplementedError(Ctx->getFlags()); |
5724 } | 5727 } |
5725 | 5728 |
5726 void TargetARM32::emit(const ConstantUndef *) const { | 5729 void TargetARM32::emit(const ConstantUndef *) const { |
5727 llvm::report_fatal_error("undef value encountered by emitter."); | 5730 llvm::report_fatal_error("undef value encountered by emitter."); |
5728 } | 5731 } |
5729 | 5732 |
| 5733 void TargetARM32::emit(const ConstantRelocatable *C) const { |
| 5734 if (!BuildDefs::dump()) |
| 5735 return; |
| 5736 Ostream &Str = Ctx->getStrEmit(); |
| 5737 Str << "#"; |
| 5738 emitWithoutPrefix(C); |
| 5739 } |
| 5740 |
5730 void TargetARM32::lowerInt1ForSelect(Variable *Dest, Operand *Boolean, | 5741 void TargetARM32::lowerInt1ForSelect(Variable *Dest, Operand *Boolean, |
5731 Operand *TrueValue, Operand *FalseValue) { | 5742 Operand *TrueValue, Operand *FalseValue) { |
5732 Operand *_1 = legalize(Ctx->getConstantInt1(1), Legal_Reg | Legal_Flex); | 5743 Operand *_1 = legalize(Ctx->getConstantInt1(1), Legal_Reg | Legal_Flex); |
5733 | 5744 |
5734 assert(Boolean->getType() == IceType_i1); | 5745 assert(Boolean->getType() == IceType_i1); |
5735 | 5746 |
5736 bool NeedsAnd1 = false; | 5747 bool NeedsAnd1 = false; |
5737 if (TrueValue->getType() == IceType_i1) { | 5748 if (TrueValue->getType() == IceType_i1) { |
5738 assert(FalseValue->getType() == IceType_i1); | 5749 assert(FalseValue->getType() == IceType_i1); |
5739 | 5750 |
(...skipping 504 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6244 if (Target->NeedSandboxing) { | 6255 if (Target->NeedSandboxing) { |
6245 Target->_bic(SP, SP, memOpBicMask(Target->Func)); | 6256 Target->_bic(SP, SP, memOpBicMask(Target->Func)); |
6246 } | 6257 } |
6247 } | 6258 } |
6248 | 6259 |
6249 TargetDataARM32::TargetDataARM32(GlobalContext *Ctx) | 6260 TargetDataARM32::TargetDataARM32(GlobalContext *Ctx) |
6250 : TargetDataLowering(Ctx) {} | 6261 : TargetDataLowering(Ctx) {} |
6251 | 6262 |
6252 void TargetDataARM32::lowerGlobals(const VariableDeclarationList &Vars, | 6263 void TargetDataARM32::lowerGlobals(const VariableDeclarationList &Vars, |
6253 const IceString &SectionSuffix) { | 6264 const IceString &SectionSuffix) { |
| 6265 const bool IsPIC = Ctx->getFlags().getUseNonsfi(); |
6254 switch (Ctx->getFlags().getOutFileType()) { | 6266 switch (Ctx->getFlags().getOutFileType()) { |
6255 case FT_Elf: { | 6267 case FT_Elf: { |
6256 ELFObjectWriter *Writer = Ctx->getObjectWriter(); | 6268 ELFObjectWriter *Writer = Ctx->getObjectWriter(); |
6257 Writer->writeDataSection(Vars, llvm::ELF::R_ARM_ABS32, SectionSuffix); | 6269 Writer->writeDataSection(Vars, llvm::ELF::R_ARM_ABS32, SectionSuffix, |
| 6270 IsPIC); |
6258 } break; | 6271 } break; |
6259 case FT_Asm: | 6272 case FT_Asm: |
6260 case FT_Iasm: { | 6273 case FT_Iasm: { |
6261 const IceString &TranslateOnly = Ctx->getFlags().getTranslateOnly(); | 6274 const IceString &TranslateOnly = Ctx->getFlags().getTranslateOnly(); |
6262 OstreamLocker _(Ctx); | 6275 OstreamLocker _(Ctx); |
6263 for (const VariableDeclaration *Var : Vars) { | 6276 for (const VariableDeclaration *Var : Vars) { |
6264 if (GlobalContext::matchSymbolName(Var->getName(), TranslateOnly)) { | 6277 if (GlobalContext::matchSymbolName(Var->getName(), TranslateOnly)) { |
6265 emitGlobal(*Var, SectionSuffix); | 6278 emitGlobal(*Var, SectionSuffix); |
6266 } | 6279 } |
6267 } | 6280 } |
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6435 // However, for compatibility with current NaCl LLVM, don't claim that. | 6448 // However, for compatibility with current NaCl LLVM, don't claim that. |
6436 Str << ".eabi_attribute 14, 3 @ Tag_ABI_PCS_R9_use: Not used\n"; | 6449 Str << ".eabi_attribute 14, 3 @ Tag_ABI_PCS_R9_use: Not used\n"; |
6437 } | 6450 } |
6438 | 6451 |
6439 llvm::SmallBitVector TargetARM32::TypeToRegisterSet[IceType_NUM]; | 6452 llvm::SmallBitVector TargetARM32::TypeToRegisterSet[IceType_NUM]; |
6440 llvm::SmallBitVector TargetARM32::RegisterAliases[RegARM32::Reg_NUM]; | 6453 llvm::SmallBitVector TargetARM32::RegisterAliases[RegARM32::Reg_NUM]; |
6441 llvm::SmallBitVector TargetARM32::ScratchRegs; | 6454 llvm::SmallBitVector TargetARM32::ScratchRegs; |
6442 | 6455 |
6443 } // end of namespace ARM32 | 6456 } // end of namespace ARM32 |
6444 } // end of namespace Ice | 6457 } // end of namespace Ice |
OLD | NEW |