Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(8)

Side by Side Diff: src/IceTargetLoweringX8664.cpp

Issue 1506653002: Subzero: Add Non-SFI support for x86-32. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Fill in part of the lit test Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 //===- subzero/src/IceTargetLoweringX8664.cpp - x86-64 lowering -----------===// 1 //===- subzero/src/IceTargetLoweringX8664.cpp - x86-64 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 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
92 92
93 template <> 93 template <>
94 std::array<llvm::SmallBitVector, 94 std::array<llvm::SmallBitVector,
95 TargetX86Base<TargetX8664>::Traits::RegisterSet::Reg_NUM> 95 TargetX86Base<TargetX8664>::Traits::RegisterSet::Reg_NUM>
96 TargetX86Base<TargetX8664>::RegisterAliases = {{}}; 96 TargetX86Base<TargetX8664>::RegisterAliases = {{}};
97 97
98 template <> 98 template <>
99 llvm::SmallBitVector 99 llvm::SmallBitVector
100 TargetX86Base<TargetX8664>::ScratchRegs = llvm::SmallBitVector(); 100 TargetX86Base<TargetX8664>::ScratchRegs = llvm::SmallBitVector();
101 101
102 template <>
103 FixupKind TargetX86Base<TargetX8664>::PcRelFixup =
104 TargetX86Base<TargetX8664>::Traits::FixupKindPcRel;
105
106 template <>
107 FixupKind TargetX86Base<TargetX8664>::RelFixup =
108 TargetX86Base<TargetX8664>::Traits::FixupKindAbs;
109
102 } // end of namespace X86Internal 110 } // end of namespace X86Internal
103 111
104 //------------------------------------------------------------------------------ 112 //------------------------------------------------------------------------------
105 // __ ______ __ __ ______ ______ __ __ __ ______ 113 // __ ______ __ __ ______ ______ __ __ __ ______
106 // /\ \ /\ __ \/\ \ _ \ \/\ ___\/\ == \/\ \/\ "-.\ \/\ ___\ 114 // /\ \ /\ __ \/\ \ _ \ \/\ ___\/\ == \/\ \/\ "-.\ \/\ ___\
107 // \ \ \___\ \ \/\ \ \ \/ ".\ \ \ __\\ \ __<\ \ \ \ \-. \ \ \__ \ 115 // \ \ \___\ \ \/\ \ \ \/ ".\ \ \ __\\ \ __<\ \ \ \ \-. \ \ \__ \
108 // \ \_____\ \_____\ \__/".~\_\ \_____\ \_\ \_\ \_\ \_\\"\_\ \_____\ 116 // \ \_____\ \_____\ \__/".~\_\ \_____\ \_\ \_\ \_\ \_\\"\_\ \_____\
109 // \/_____/\/_____/\/_/ \/_/\/_____/\/_/ /_/\/_/\/_/ \/_/\/_____/ 117 // \/_____/\/_____/\/_/ \/_/\/_____/\/_/ /_/\/_/\/_/ \/_/\/_____/
110 // 118 //
111 //------------------------------------------------------------------------------ 119 //------------------------------------------------------------------------------
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
301 _movp(Dest, ReturnReg); 309 _movp(Dest, ReturnReg);
302 } else { 310 } else {
303 assert(isScalarFloatingType(Dest->getType()) || 311 assert(isScalarFloatingType(Dest->getType()) ||
304 isScalarIntegerType(Dest->getType())); 312 isScalarIntegerType(Dest->getType()));
305 _mov(Dest, ReturnReg); 313 _mov(Dest, ReturnReg);
306 } 314 }
307 } 315 }
308 316
309 void TargetX8664::lowerArguments() { 317 void TargetX8664::lowerArguments() {
310 VarList &Args = Func->getArgs(); 318 VarList &Args = Func->getArgs();
311 // The first eight vetcor typed arguments (as well as fp arguments) are 319 // The first eight vector typed arguments (as well as fp arguments) are
312 // passed in %xmm0 through %xmm7 regardless of their position in the argument 320 // passed in %xmm0 through %xmm7 regardless of their position in the argument
313 // list. 321 // list.
314 unsigned NumXmmArgs = 0; 322 unsigned NumXmmArgs = 0;
315 // The first six integer typed arguments are passed in %rdi, %rsi, %rdx, 323 // The first six integer typed arguments are passed in %rdi, %rsi, %rdx,
316 // %rcx, %r8, and %r9 regardless of their position in the argument list. 324 // %rcx, %r8, and %r9 regardless of their position in the argument list.
317 unsigned NumGprArgs = 0; 325 unsigned NumGprArgs = 0;
318 326
319 Context.init(Func->getEntryNode()); 327 Context.init(Func->getEntryNode());
320 Context.setInsertPoint(Context.getCur()); 328 Context.setInsertPoint(Context.getCur());
321 329
(...skipping 501 matching lines...) Expand 10 before | Expand all | Expand 10 after
823 emitConstantPool<PoolTypeConverter<uint16_t>>(Ctx); 831 emitConstantPool<PoolTypeConverter<uint16_t>>(Ctx);
824 emitConstantPool<PoolTypeConverter<uint32_t>>(Ctx); 832 emitConstantPool<PoolTypeConverter<uint32_t>>(Ctx);
825 833
826 emitConstantPool<PoolTypeConverter<float>>(Ctx); 834 emitConstantPool<PoolTypeConverter<float>>(Ctx);
827 emitConstantPool<PoolTypeConverter<double>>(Ctx); 835 emitConstantPool<PoolTypeConverter<double>>(Ctx);
828 } break; 836 } break;
829 } 837 }
830 } 838 }
831 839
832 void TargetDataX8664::lowerJumpTables() { 840 void TargetDataX8664::lowerJumpTables() {
841 const bool IsPIC = Ctx->getFlags().getUseNonsfi();
833 switch (Ctx->getFlags().getOutFileType()) { 842 switch (Ctx->getFlags().getOutFileType()) {
834 case FT_Elf: { 843 case FT_Elf: {
835 ELFObjectWriter *Writer = Ctx->getObjectWriter(); 844 ELFObjectWriter *Writer = Ctx->getObjectWriter();
836 for (const JumpTableData &JumpTable : Ctx->getJumpTables()) 845 for (const JumpTableData &JumpTable : Ctx->getJumpTables())
837 Writer->writeJumpTable(JumpTable, TargetX8664::Traits::RelFixup); 846 Writer->writeJumpTable(JumpTable, TargetX8664::Traits::FixupKindAbs,
847 IsPIC);
838 } break; 848 } break;
839 case FT_Asm: 849 case FT_Asm:
840 // Already emitted from Cfg 850 // Already emitted from Cfg
841 break; 851 break;
842 case FT_Iasm: { 852 case FT_Iasm: {
843 if (!BuildDefs::dump()) 853 if (!BuildDefs::dump())
844 return; 854 return;
845 Ostream &Str = Ctx->getStrEmit(); 855 Ostream &Str = Ctx->getStrEmit();
846 for (const JumpTableData &JT : Ctx->getJumpTables()) { 856 for (const JumpTableData &JT : Ctx->getJumpTables()) {
847 Str << "\t.section\t.rodata." << JT.getFunctionName() 857 Str << "\t.section\t.rodata." << JT.getFunctionName()
848 << "$jumptable,\"a\",@progbits\n"; 858 << "$jumptable,\"a\",@progbits\n";
849 Str << "\t.align\t" << typeWidthInBytes(getPointerType()) << "\n"; 859 Str << "\t.align\t" << typeWidthInBytes(getPointerType()) << "\n";
850 Str << InstJumpTable::makeName(JT.getFunctionName(), JT.getId()) << ":"; 860 Str << InstJumpTable::makeName(JT.getFunctionName(), JT.getId()) << ":";
851 861
852 // On X8664 ILP32 pointers are 32-bit hence the use of .long 862 // On X8664 ILP32 pointers are 32-bit hence the use of .long
853 for (intptr_t TargetOffset : JT.getTargetOffsets()) 863 for (intptr_t TargetOffset : JT.getTargetOffsets())
854 Str << "\n\t.long\t" << JT.getFunctionName() << "+" << TargetOffset; 864 Str << "\n\t.long\t" << JT.getFunctionName() << "+" << TargetOffset;
855 Str << "\n"; 865 Str << "\n";
856 } 866 }
857 } break; 867 } break;
858 } 868 }
859 } 869 }
860 870
861 void TargetDataX8664::lowerGlobals(const VariableDeclarationList &Vars, 871 void TargetDataX8664::lowerGlobals(const VariableDeclarationList &Vars,
862 const IceString &SectionSuffix) { 872 const IceString &SectionSuffix) {
873 const bool IsPIC = Ctx->getFlags().getUseNonsfi();
863 switch (Ctx->getFlags().getOutFileType()) { 874 switch (Ctx->getFlags().getOutFileType()) {
864 case FT_Elf: { 875 case FT_Elf: {
865 ELFObjectWriter *Writer = Ctx->getObjectWriter(); 876 ELFObjectWriter *Writer = Ctx->getObjectWriter();
866 Writer->writeDataSection(Vars, TargetX8664::Traits::RelFixup, 877 Writer->writeDataSection(Vars, TargetX8664::Traits::FixupKindAbs,
867 SectionSuffix); 878 SectionSuffix, IsPIC);
868 } break; 879 } break;
869 case FT_Asm: 880 case FT_Asm:
870 case FT_Iasm: { 881 case FT_Iasm: {
871 const IceString &TranslateOnly = Ctx->getFlags().getTranslateOnly(); 882 const IceString &TranslateOnly = Ctx->getFlags().getTranslateOnly();
872 OstreamLocker L(Ctx); 883 OstreamLocker L(Ctx);
873 for (const VariableDeclaration *Var : Vars) { 884 for (const VariableDeclaration *Var : Vars) {
874 if (GlobalContext::matchSymbolName(Var->getName(), TranslateOnly)) { 885 if (GlobalContext::matchSymbolName(Var->getName(), TranslateOnly)) {
875 emitGlobal(*Var, SectionSuffix); 886 emitGlobal(*Var, SectionSuffix);
876 } 887 }
877 } 888 }
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
977 // case the high-level table has extra entries. 988 // case the high-level table has extra entries.
978 #define X(tag, sizeLog2, align, elts, elty, str) \ 989 #define X(tag, sizeLog2, align, elts, elty, str) \
979 static_assert(_table1_##tag == _table2_##tag, \ 990 static_assert(_table1_##tag == _table2_##tag, \
980 "Inconsistency between ICETYPEX8664_TABLE and ICETYPE_TABLE"); 991 "Inconsistency between ICETYPEX8664_TABLE and ICETYPE_TABLE");
981 ICETYPE_TABLE 992 ICETYPE_TABLE
982 #undef X 993 #undef X
983 } // end of namespace dummy3 994 } // end of namespace dummy3
984 } // end of anonymous namespace 995 } // end of anonymous namespace
985 996
986 } // end of namespace Ice 997 } // end of namespace Ice
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698