Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 //===-- MipsASMBackend.cpp - Mips Asm Backend ----------------------------===// | 1 //===-- MipsASMBackend.cpp - Mips Asm 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 // This file implements the MipsAsmBackend and MipsELFObjectWriter classes. | 10 // This file implements the MipsAsmBackend and MipsELFObjectWriter classes. |
| 11 // | 11 // |
| 12 //===----------------------------------------------------------------------===// | 12 //===----------------------------------------------------------------------===// |
| 13 // | 13 // |
| 14 | 14 |
| 15 #include "MipsFixupKinds.h" | 15 #include "MipsFixupKinds.h" |
| 16 #include "MCTargetDesc/MipsMCTargetDesc.h" | 16 #include "MCTargetDesc/MipsMCTargetDesc.h" |
| 17 #include "MCTargetDesc/MipsMCNaCl.h" // @LOCALMOD | 17 // @LOCALMOD-START |
| 18 #include "MCTargetDesc/MipsMCNaCl.h" | |
| 19 #include "llvm/MC/MCAsmLayout.h" | |
| 20 #include "llvm/MC/MCExpr.h" | |
| 21 #include "llvm/MC/MCValue.h" | |
| 22 // @LOCALMOD-END | |
| 18 #include "llvm/MC/MCAsmBackend.h" | 23 #include "llvm/MC/MCAsmBackend.h" |
| 19 #include "llvm/MC/MCAssembler.h" | 24 #include "llvm/MC/MCAssembler.h" |
| 20 #include "llvm/MC/MCDirectives.h" | 25 #include "llvm/MC/MCDirectives.h" |
| 21 #include "llvm/MC/MCELFObjectWriter.h" | 26 #include "llvm/MC/MCELFObjectWriter.h" |
| 22 #include "llvm/MC/MCFixupKindInfo.h" | 27 #include "llvm/MC/MCFixupKindInfo.h" |
| 23 #include "llvm/MC/MCObjectWriter.h" | 28 #include "llvm/MC/MCObjectWriter.h" |
| 24 #include "llvm/MC/MCSubtargetInfo.h" | 29 #include "llvm/MC/MCSubtargetInfo.h" |
| 25 #include "llvm/Support/ErrorHandling.h" | 30 #include "llvm/Support/ErrorHandling.h" |
| 26 #include "llvm/Support/raw_ostream.h" | 31 #include "llvm/Support/raw_ostream.h" |
| 27 | 32 |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 91 public: | 96 public: |
| 92 MipsAsmBackend(const Target &T, Triple::OSType _OSType, | 97 MipsAsmBackend(const Target &T, Triple::OSType _OSType, |
| 93 bool _isLittle, bool _is64Bit) | 98 bool _isLittle, bool _is64Bit) |
| 94 :MCAsmBackend(), OSType(_OSType), IsLittle(_isLittle), Is64Bit(_is64Bit) {} | 99 :MCAsmBackend(), OSType(_OSType), IsLittle(_isLittle), Is64Bit(_is64Bit) {} |
| 95 | 100 |
| 96 MCObjectWriter *createObjectWriter(raw_ostream &OS) const { | 101 MCObjectWriter *createObjectWriter(raw_ostream &OS) const { |
| 97 return createMipsELFObjectWriter(OS, | 102 return createMipsELFObjectWriter(OS, |
| 98 MCELFObjectTargetWriter::getOSABI(OSType), IsLittle, Is64Bit); | 103 MCELFObjectTargetWriter::getOSABI(OSType), IsLittle, Is64Bit); |
| 99 } | 104 } |
| 100 | 105 |
| 106 // @LOCALMOD-START | |
| 107 /// processFixupValue - Target hook to process the literal value of a fixup | |
| 108 /// if necessary. | |
| 109 void processFixupValue(const MCAssembler &Asm, const MCAsmLayout &Layout, | |
|
Mark Seaborn
2013/11/28 03:37:02
Can you send this part to upstream LLVM? You can
| |
| 110 const MCFixup &Fixup, const MCFragment *DF, | |
| 111 MCValue &Target, uint64_t &Value, | |
| 112 bool &IsResolved) { | |
| 113 if ((unsigned)Fixup.getKind() == Mips::fixup_Mips_HI16 | |
| 114 || (unsigned)Fixup.getKind() == Mips::fixup_Mips_LO16) { | |
| 115 | |
| 116 // Check for expressions %hi(tmp) and %lo(tmp), where tmp = sym1-sym2. | |
|
Mark Seaborn
2013/11/28 03:37:02
This part isn't MIPS specific, so I wonder if you
| |
| 117 if (Target.getSymA() != NULL && Target.getSymA()->getSymbol().isVariable() | |
| 118 && Target.getSymB() == NULL && Target.getConstant() == 0) { | |
| 119 const MCExpr *SymValue = Target.getSymA()->getSymbol() | |
| 120 .getVariableValue(); | |
| 121 const MCBinaryExpr *BE = dyn_cast<MCBinaryExpr>(SymValue); | |
| 122 if (BE && BE->getOpcode() == MCBinaryExpr::Sub) { | |
| 123 const MCSymbolRefExpr *LHS = dyn_cast<MCSymbolRefExpr>(BE->getLHS()); | |
| 124 const MCSymbolRefExpr *RHS = dyn_cast<MCSymbolRefExpr>(BE->getRHS()); | |
| 125 if (LHS != NULL && LHS->getSymbol().isDefined() | |
| 126 && RHS != NULL && RHS->getSymbol().isDefined()) { | |
| 127 // Don't emit relocation for expressions %hi(tmp) and %lo(tmp), | |
| 128 // where tmp = sym1-sym2. | |
| 129 IsResolved = true; | |
| 130 | |
| 131 // Calculate symbol value. | |
| 132 uint64_t Value1 = | |
| 133 Layout.getSymbolOffset(&Asm.getSymbolData(LHS->getSymbol())); | |
| 134 uint64_t Value2 = | |
| 135 Layout.getSymbolOffset(&Asm.getSymbolData(RHS->getSymbol())); | |
| 136 Value = Value1 - Value2; | |
| 137 } | |
| 138 } | |
| 139 } | |
| 140 } | |
| 141 } | |
| 142 // @LOCALMOD-END | |
| 143 | |
| 101 /// ApplyFixup - Apply the \p Value for given \p Fixup into the provided | 144 /// ApplyFixup - Apply the \p Value for given \p Fixup into the provided |
| 102 /// data fragment, at the offset specified by the fixup and following the | 145 /// data fragment, at the offset specified by the fixup and following the |
| 103 /// fixup kind as appropriate. | 146 /// fixup kind as appropriate. |
| 104 void applyFixup(const MCFixup &Fixup, char *Data, unsigned DataSize, | 147 void applyFixup(const MCFixup &Fixup, char *Data, unsigned DataSize, |
| 105 uint64_t Value) const { | 148 uint64_t Value) const { |
| 106 MCFixupKind Kind = Fixup.getKind(); | 149 MCFixupKind Kind = Fixup.getKind(); |
| 107 Value = adjustFixupValue((unsigned)Kind, Value); | 150 Value = adjustFixupValue((unsigned)Kind, Value); |
| 108 | 151 |
| 109 if (!Value) | 152 if (!Value) |
| 110 return; // Doesn't change encoding. | 153 return; // Doesn't change encoding. |
| (...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 290 // @LOCALMOD-END | 333 // @LOCALMOD-END |
| 291 return new MipsAsmBackend(T, Triple(TT).getOS(), | 334 return new MipsAsmBackend(T, Triple(TT).getOS(), |
| 292 /*IsLittle*/true, /*Is64Bit*/true); | 335 /*IsLittle*/true, /*Is64Bit*/true); |
| 293 } | 336 } |
| 294 | 337 |
| 295 MCAsmBackend *llvm::createMipsAsmBackendEB64(const Target &T, StringRef TT, | 338 MCAsmBackend *llvm::createMipsAsmBackendEB64(const Target &T, StringRef TT, |
| 296 StringRef CPU) { | 339 StringRef CPU) { |
| 297 return new MipsAsmBackend(T, Triple(TT).getOS(), | 340 return new MipsAsmBackend(T, Triple(TT).getOS(), |
| 298 /*IsLittle*/false, /*Is64Bit*/true); | 341 /*IsLittle*/false, /*Is64Bit*/true); |
| 299 } | 342 } |
| OLD | NEW |