| OLD | NEW |
| 1 //===- subzero/src/IceTargetLoweringX8632.cpp - x86-32 lowering -----------===// | 1 //===- subzero/src/IceTargetLoweringX8632.cpp - x86-32 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 17 matching lines...) Expand all Loading... |
| 28 Ctx); | 28 Ctx); |
| 29 } | 29 } |
| 30 | 30 |
| 31 std::unique_ptr<::Ice::TargetHeaderLowering> | 31 std::unique_ptr<::Ice::TargetHeaderLowering> |
| 32 createTargetHeaderLowering(::Ice::GlobalContext *Ctx) { | 32 createTargetHeaderLowering(::Ice::GlobalContext *Ctx) { |
| 33 return ::Ice::X8632::TargetHeaderX86::create(Ctx); | 33 return ::Ice::X8632::TargetHeaderX86::create(Ctx); |
| 34 } | 34 } |
| 35 | 35 |
| 36 void staticInit(::Ice::GlobalContext *Ctx) { | 36 void staticInit(::Ice::GlobalContext *Ctx) { |
| 37 ::Ice::X8632::TargetX8632::staticInit(Ctx); | 37 ::Ice::X8632::TargetX8632::staticInit(Ctx); |
| 38 if (Ctx->getFlags().getUseNonsfi()) { | 38 if (Ice::getFlags().getUseNonsfi()) { |
| 39 // In nonsfi, we need to reference the _GLOBAL_OFFSET_TABLE_ for accessing | 39 // In nonsfi, we need to reference the _GLOBAL_OFFSET_TABLE_ for accessing |
| 40 // globals. The GOT is an external symbol (i.e., it is not defined in the | 40 // globals. The GOT is an external symbol (i.e., it is not defined in the |
| 41 // pexe) so we need to register it as such so that ELF emission won't barf | 41 // pexe) so we need to register it as such so that ELF emission won't barf |
| 42 // on an "unknown" symbol. The GOT is added to the External symbols list | 42 // on an "unknown" symbol. The GOT is added to the External symbols list |
| 43 // here because staticInit() is invoked in a single-thread context. | 43 // here because staticInit() is invoked in a single-thread context. |
| 44 Ctx->getConstantExternSym(Ctx->getGlobalString(::Ice::GlobalOffsetTable)); | 44 Ctx->getConstantExternSym(Ctx->getGlobalString(::Ice::GlobalOffsetTable)); |
| 45 } | 45 } |
| 46 } | 46 } |
| 47 | 47 |
| 48 bool shouldBePooled(const class ::Ice::Constant *C) { | 48 bool shouldBePooled(const class ::Ice::Constant *C) { |
| (...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 220 void TargetX8632::_push_reg(Variable *Reg) { _push(Reg); } | 220 void TargetX8632::_push_reg(Variable *Reg) { _push(Reg); } |
| 221 | 221 |
| 222 void TargetX8632::emitGetIP(CfgNode *Node) { | 222 void TargetX8632::emitGetIP(CfgNode *Node) { |
| 223 // If there is a non-deleted InstX86GetIP instruction, we need to move it to | 223 // If there is a non-deleted InstX86GetIP instruction, we need to move it to |
| 224 // the point after the stack frame has stabilized but before | 224 // the point after the stack frame has stabilized but before |
| 225 // register-allocated in-args are copied into their home registers. It would | 225 // register-allocated in-args are copied into their home registers. It would |
| 226 // be slightly faster to search for the GetIP instruction before other prolog | 226 // be slightly faster to search for the GetIP instruction before other prolog |
| 227 // instructions are inserted, but it's more clear to do the whole | 227 // instructions are inserted, but it's more clear to do the whole |
| 228 // transformation in a single place. | 228 // transformation in a single place. |
| 229 Traits::Insts::GetIP *GetIPInst = nullptr; | 229 Traits::Insts::GetIP *GetIPInst = nullptr; |
| 230 if (Ctx->getFlags().getUseNonsfi()) { | 230 if (getFlags().getUseNonsfi()) { |
| 231 for (Inst &Instr : Node->getInsts()) { | 231 for (Inst &Instr : Node->getInsts()) { |
| 232 if (auto *GetIP = llvm::dyn_cast<Traits::Insts::GetIP>(&Instr)) { | 232 if (auto *GetIP = llvm::dyn_cast<Traits::Insts::GetIP>(&Instr)) { |
| 233 if (!Instr.isDeleted()) | 233 if (!Instr.isDeleted()) |
| 234 GetIPInst = GetIP; | 234 GetIPInst = GetIP; |
| 235 break; | 235 break; |
| 236 } | 236 } |
| 237 } | 237 } |
| 238 } | 238 } |
| 239 // Delete any existing InstX86GetIP instruction and reinsert it here. Also, | 239 // Delete any existing InstX86GetIP instruction and reinsert it here. Also, |
| 240 // insert the call to the helper function and the spill to the stack, to | 240 // insert the call to the helper function and the spill to the stack, to |
| (...skipping 241 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 482 #define X(tag, sizeLog2, align, elts, elty, str, rcstr) \ | 482 #define X(tag, sizeLog2, align, elts, elty, str, rcstr) \ |
| 483 static_assert(_table1_##tag == _table2_##tag, \ | 483 static_assert(_table1_##tag == _table2_##tag, \ |
| 484 "Inconsistency between ICETYPEX8632_TABLE and ICETYPE_TABLE"); | 484 "Inconsistency between ICETYPEX8632_TABLE and ICETYPE_TABLE"); |
| 485 ICETYPE_TABLE | 485 ICETYPE_TABLE |
| 486 #undef X | 486 #undef X |
| 487 } // end of namespace dummy3 | 487 } // end of namespace dummy3 |
| 488 } // end of anonymous namespace | 488 } // end of anonymous namespace |
| 489 | 489 |
| 490 } // end of namespace X8632 | 490 } // end of namespace X8632 |
| 491 } // end of namespace Ice | 491 } // end of namespace Ice |
| OLD | NEW |