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

Side by Side Diff: lib/Target/X86/MCTargetDesc/X86AsmBackend.cpp

Issue 939073008: Rebased PNaCl localmods in LLVM to 223109 (Closed)
Patch Set: undo localmod Created 5 years, 10 months 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
« no previous file with comments | « lib/Target/X86/MCTargetDesc/CMakeLists.txt ('k') | lib/Target/X86/MCTargetDesc/X86BaseInfo.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 //===-- X86AsmBackend.cpp - X86 Assembler Backend -------------------------===// 1 //===-- X86AsmBackend.cpp - X86 Assembler Backend -------------------------===//
2 // 2 //
3 // The LLVM Compiler Infrastructure 3 // The LLVM Compiler Infrastructure
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 #include "MCTargetDesc/X86BaseInfo.h" 10 #include "MCTargetDesc/X86BaseInfo.h"
11 #include "MCTargetDesc/X86FixupKinds.h" 11 #include "MCTargetDesc/X86FixupKinds.h"
12 #include "MCTargetDesc/X86MCNaCl.h" // @LOCALMOD
12 #include "llvm/ADT/StringSwitch.h" 13 #include "llvm/ADT/StringSwitch.h"
13 #include "llvm/MC/MCAsmBackend.h" 14 #include "llvm/MC/MCAsmBackend.h"
14 #include "llvm/MC/MCELFObjectWriter.h" 15 #include "llvm/MC/MCELFObjectWriter.h"
15 #include "llvm/MC/MCExpr.h" 16 #include "llvm/MC/MCExpr.h"
16 #include "llvm/MC/MCFixupKindInfo.h" 17 #include "llvm/MC/MCFixupKindInfo.h"
17 #include "llvm/MC/MCMachObjectWriter.h" 18 #include "llvm/MC/MCMachObjectWriter.h"
18 #include "llvm/MC/MCObjectWriter.h" 19 #include "llvm/MC/MCObjectWriter.h"
19 #include "llvm/MC/MCSectionCOFF.h" 20 #include "llvm/MC/MCSectionCOFF.h"
20 #include "llvm/MC/MCSectionELF.h" 21 #include "llvm/MC/MCSectionELF.h"
21 #include "llvm/MC/MCSectionMachO.h" 22 #include "llvm/MC/MCSectionMachO.h"
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
105 return Infos[Kind - FirstTargetFixupKind]; 106 return Infos[Kind - FirstTargetFixupKind];
106 } 107 }
107 108
108 void applyFixup(const MCFixup &Fixup, char *Data, unsigned DataSize, 109 void applyFixup(const MCFixup &Fixup, char *Data, unsigned DataSize,
109 uint64_t Value, bool IsPCRel) const override { 110 uint64_t Value, bool IsPCRel) const override {
110 unsigned Size = 1 << getFixupKindLog2Size(Fixup.getKind()); 111 unsigned Size = 1 << getFixupKindLog2Size(Fixup.getKind());
111 112
112 assert(Fixup.getOffset() + Size <= DataSize && 113 assert(Fixup.getOffset() + Size <= DataSize &&
113 "Invalid fixup offset!"); 114 "Invalid fixup offset!");
114 115
116 // @LOCALMOD-BEGIN
117 // This check breaks negative addends on x86-32. It makes x86-32
118 // behaviour inconsistent with x86-64 and ARM.
119 // See: https://code.google.com/p/nativeclient/issues/detail?id=3548
120 #if 0
115 // Check that uppper bits are either all zeros or all ones. 121 // Check that uppper bits are either all zeros or all ones.
116 // Specifically ignore overflow/underflow as long as the leakage is 122 // Specifically ignore overflow/underflow as long as the leakage is
117 // limited to the lower bits. This is to remain compatible with 123 // limited to the lower bits. This is to remain compatible with
118 // other assemblers. 124 // other assemblers.
119 assert(isIntN(Size * 8 + 1, Value) && 125 assert(isIntN(Size * 8 + 1, Value) &&
120 "Value does not fit in the Fixup field"); 126 "Value does not fit in the Fixup field");
127 #endif
128 // @LOCALMOD-END
121 129
122 for (unsigned i = 0; i != Size; ++i) 130 for (unsigned i = 0; i != Size; ++i)
123 Data[Fixup.getOffset() + i] = uint8_t(Value >> (i * 8)); 131 Data[Fixup.getOffset() + i] = uint8_t(Value >> (i * 8));
124 } 132 }
125 133
126 bool mayNeedRelaxation(const MCInst &Inst) const override; 134 bool mayNeedRelaxation(const MCInst &Inst) const override;
127 135
128 bool fixupNeedsRelaxation(const MCFixup &Fixup, uint64_t Value, 136 bool fixupNeedsRelaxation(const MCFixup &Fixup, uint64_t Value,
129 const MCRelaxableFragment *DF, 137 const MCRelaxableFragment *DF,
130 const MCAsmLayout &Layout) const override; 138 const MCAsmLayout &Layout) const override;
(...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after
379 class ELFX86_64AsmBackend : public ELFX86AsmBackend { 387 class ELFX86_64AsmBackend : public ELFX86AsmBackend {
380 public: 388 public:
381 ELFX86_64AsmBackend(const Target &T, uint8_t OSABI, StringRef CPU) 389 ELFX86_64AsmBackend(const Target &T, uint8_t OSABI, StringRef CPU)
382 : ELFX86AsmBackend(T, OSABI, CPU) {} 390 : ELFX86AsmBackend(T, OSABI, CPU) {}
383 391
384 MCObjectWriter *createObjectWriter(raw_ostream &OS) const override { 392 MCObjectWriter *createObjectWriter(raw_ostream &OS) const override {
385 return createX86ELFObjectWriter(OS, /*IsELF64*/ true, OSABI, ELF::EM_X86_64) ; 393 return createX86ELFObjectWriter(OS, /*IsELF64*/ true, OSABI, ELF::EM_X86_64) ;
386 } 394 }
387 }; 395 };
388 396
397 // @LOCALMOD-BEGIN
398 class NaClX86_32AsmBackend : public ELFX86_32AsmBackend {
399 public:
400 NaClX86_32AsmBackend(const Target &T, uint8_t OSABI, StringRef CPU)
401 : ELFX86_32AsmBackend(T, OSABI, CPU),
402 STI(X86_MC::createX86MCSubtargetInfo("i386-unknown-nacl", CPU, "")) {
403 State.PrefixSaved = 0;
404 State.PrefixPass = false;
405 State.EmitRaw = false;
406 }
407 ~NaClX86_32AsmBackend() override {}
408
409 bool CustomExpandInst(const MCInst &Inst, MCStreamer &Out) override {
410 return CustomExpandInstNaClX86(*STI, Inst, Out, State);
411 }
412
413 private:
414 std::unique_ptr<MCSubtargetInfo> STI;
415 X86MCNaClSFIState State;
416 };
417
418 class NaClX86_64AsmBackend : public ELFX86_64AsmBackend {
419 public:
420 NaClX86_64AsmBackend(const Target &T, uint8_t OSABI, StringRef CPU)
421 : ELFX86_64AsmBackend(T, OSABI, CPU),
422 STI(X86_MC::createX86MCSubtargetInfo("x86_64-unknown-nacl", CPU, "")) {
423 State.PrefixSaved = 0;
424 State.PrefixPass = false;
425 State.EmitRaw = false;
426 }
427 ~NaClX86_64AsmBackend() override {}
428
429 bool CustomExpandInst(const MCInst &Inst, MCStreamer &Out) override {
430 return CustomExpandInstNaClX86(*STI, Inst, Out, State);
431 }
432
433 private:
434 std::unique_ptr<MCSubtargetInfo> STI;
435 X86MCNaClSFIState State;
436 };
437 // @LOCALMOD-END
438
389 class WindowsX86AsmBackend : public X86AsmBackend { 439 class WindowsX86AsmBackend : public X86AsmBackend {
390 bool Is64Bit; 440 bool Is64Bit;
391 441
392 public: 442 public:
393 WindowsX86AsmBackend(const Target &T, bool is64Bit, StringRef CPU) 443 WindowsX86AsmBackend(const Target &T, bool is64Bit, StringRef CPU)
394 : X86AsmBackend(T, CPU) 444 : X86AsmBackend(T, CPU)
395 , Is64Bit(is64Bit) { 445 , Is64Bit(is64Bit) {
396 } 446 }
397 447
398 MCObjectWriter *createObjectWriter(raw_ostream &OS) const override { 448 MCObjectWriter *createObjectWriter(raw_ostream &OS) const override {
(...skipping 426 matching lines...) Expand 10 before | Expand all | Expand 10 after
825 StringRef CPU) { 875 StringRef CPU) {
826 Triple TheTriple(TT); 876 Triple TheTriple(TT);
827 877
828 if (TheTriple.isOSBinFormatMachO()) 878 if (TheTriple.isOSBinFormatMachO())
829 return new DarwinX86_32AsmBackend(T, MRI, CPU); 879 return new DarwinX86_32AsmBackend(T, MRI, CPU);
830 880
831 if (TheTriple.isOSWindows() && !TheTriple.isOSBinFormatELF()) 881 if (TheTriple.isOSWindows() && !TheTriple.isOSBinFormatELF())
832 return new WindowsX86AsmBackend(T, false, CPU); 882 return new WindowsX86AsmBackend(T, false, CPU);
833 883
834 uint8_t OSABI = MCELFObjectTargetWriter::getOSABI(TheTriple.getOS()); 884 uint8_t OSABI = MCELFObjectTargetWriter::getOSABI(TheTriple.getOS());
885 // @LOCALMOD-BEGIN
886 if (TheTriple.isOSNaCl())
887 return new NaClX86_32AsmBackend(T, OSABI, CPU);
888 // @LOCALMOD-END
835 return new ELFX86_32AsmBackend(T, OSABI, CPU); 889 return new ELFX86_32AsmBackend(T, OSABI, CPU);
836 } 890 }
837 891
838 MCAsmBackend *llvm::createX86_64AsmBackend(const Target &T, 892 MCAsmBackend *llvm::createX86_64AsmBackend(const Target &T,
839 const MCRegisterInfo &MRI, 893 const MCRegisterInfo &MRI,
840 StringRef TT, 894 StringRef TT,
841 StringRef CPU) { 895 StringRef CPU) {
842 Triple TheTriple(TT); 896 Triple TheTriple(TT);
843 897
844 if (TheTriple.isOSBinFormatMachO()) { 898 if (TheTriple.isOSBinFormatMachO()) {
845 MachO::CPUSubTypeX86 CS = 899 MachO::CPUSubTypeX86 CS =
846 StringSwitch<MachO::CPUSubTypeX86>(TheTriple.getArchName()) 900 StringSwitch<MachO::CPUSubTypeX86>(TheTriple.getArchName())
847 .Case("x86_64h", MachO::CPU_SUBTYPE_X86_64_H) 901 .Case("x86_64h", MachO::CPU_SUBTYPE_X86_64_H)
848 .Default(MachO::CPU_SUBTYPE_X86_64_ALL); 902 .Default(MachO::CPU_SUBTYPE_X86_64_ALL);
849 return new DarwinX86_64AsmBackend(T, MRI, CPU, CS); 903 return new DarwinX86_64AsmBackend(T, MRI, CPU, CS);
850 } 904 }
851 905
852 if (TheTriple.isOSWindows() && !TheTriple.isOSBinFormatELF()) 906 if (TheTriple.isOSWindows() && !TheTriple.isOSBinFormatELF())
853 return new WindowsX86AsmBackend(T, true, CPU); 907 return new WindowsX86AsmBackend(T, true, CPU);
854 908
855 uint8_t OSABI = MCELFObjectTargetWriter::getOSABI(TheTriple.getOS()); 909 uint8_t OSABI = MCELFObjectTargetWriter::getOSABI(TheTriple.getOS());
856 910
911 // @LOCALMOD-BEGIN
912 if (TheTriple.isOSNaCl())
913 return new NaClX86_64AsmBackend(T, OSABI, CPU);
914 // @LOCALMOD-END
857 if (TheTriple.getEnvironment() == Triple::GNUX32) 915 if (TheTriple.getEnvironment() == Triple::GNUX32)
858 return new ELFX86_X32AsmBackend(T, OSABI, CPU); 916 return new ELFX86_X32AsmBackend(T, OSABI, CPU);
859 return new ELFX86_64AsmBackend(T, OSABI, CPU); 917 return new ELFX86_64AsmBackend(T, OSABI, CPU);
860 } 918 }
OLDNEW
« no previous file with comments | « lib/Target/X86/MCTargetDesc/CMakeLists.txt ('k') | lib/Target/X86/MCTargetDesc/X86BaseInfo.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698