diff options
| -rw-r--r-- | llvm/lib/MC/ELFObjectWriter.cpp | 9 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86AsmBackend.cpp | 1 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86FixupKinds.h | 5 | ||||
| -rw-r--r-- | llvm/lib/Target/X86/X86MCCodeEmitter.cpp | 11 | 
4 files changed, 16 insertions, 10 deletions
diff --git a/llvm/lib/MC/ELFObjectWriter.cpp b/llvm/lib/MC/ELFObjectWriter.cpp index dad69eb14ab..db33af67d6f 100644 --- a/llvm/lib/MC/ELFObjectWriter.cpp +++ b/llvm/lib/MC/ELFObjectWriter.cpp @@ -701,6 +701,10 @@ void ELFObjectWriterImpl::RecordRelocation(const MCAssembler &Asm,        switch ((unsigned)Fixup.getKind()) {        default: llvm_unreachable("invalid fixup kind!"); +      case X86::reloc_global_offset_table: +        Type = ELF::R_386_GOTPC; +        break; +        // FIXME: Should we avoid selecting reloc_signed_4byte in 32 bit mode        // instead?        case X86::reloc_signed_4byte: @@ -710,10 +714,7 @@ void ELFObjectWriterImpl::RecordRelocation(const MCAssembler &Asm,          default:            llvm_unreachable("Unimplemented");          case MCSymbolRefExpr::VK_None: -          if (Symbol->getName() == "_GLOBAL_OFFSET_TABLE_") -            Type = ELF::R_386_GOTPC; -          else -            Type = ELF::R_386_32; +          Type = ELF::R_386_32;            break;          case MCSymbolRefExpr::VK_GOT:            Type = ELF::R_386_GOT32; diff --git a/llvm/lib/Target/X86/X86AsmBackend.cpp b/llvm/lib/Target/X86/X86AsmBackend.cpp index 17db41a76bb..be5671919dc 100644 --- a/llvm/lib/Target/X86/X86AsmBackend.cpp +++ b/llvm/lib/Target/X86/X86AsmBackend.cpp @@ -39,6 +39,7 @@ static unsigned getFixupKindLog2Size(unsigned Kind) {    case X86::reloc_riprel_4byte:    case X86::reloc_riprel_4byte_movq_load:    case X86::reloc_signed_4byte: +  case X86::reloc_global_offset_table:    case FK_Data_4: return 2;    case FK_Data_8: return 3;    } diff --git a/llvm/lib/Target/X86/X86FixupKinds.h b/llvm/lib/Target/X86/X86FixupKinds.h index f408a413f04..64ee3eb3304 100644 --- a/llvm/lib/Target/X86/X86FixupKinds.h +++ b/llvm/lib/Target/X86/X86FixupKinds.h @@ -20,9 +20,12 @@ enum Fixups {    reloc_pcrel_2byte,                         // 16-bit pcrel, e.g. callw    reloc_riprel_4byte,                        // 32-bit rip-relative    reloc_riprel_4byte_movq_load,              // 32-bit rip-relative in movq -  reloc_signed_4byte                         // 32-bit signed. Unlike FK_Data_4 +  reloc_signed_4byte,                        // 32-bit signed. Unlike FK_Data_4                                               // this will be sign extended at                                               // runtime. +  reloc_global_offset_table                  // 32-bit, relative to the start +                                             // of the instruction. Used only +                                             // for _GLOBAL_OFFSET_TABLE_.  };  }  } diff --git a/llvm/lib/Target/X86/X86MCCodeEmitter.cpp b/llvm/lib/Target/X86/X86MCCodeEmitter.cpp index 47e91a8159c..950fdf107a2 100644 --- a/llvm/lib/Target/X86/X86MCCodeEmitter.cpp +++ b/llvm/lib/Target/X86/X86MCCodeEmitter.cpp @@ -39,7 +39,7 @@ public:    ~X86MCCodeEmitter() {}    unsigned getNumFixupKinds() const { -    return 6; +    return 7;    }    const MCFixupKindInfo &getFixupKindInfo(MCFixupKind Kind) const { @@ -49,7 +49,8 @@ public:        { "reloc_pcrel_2byte", 0, 2 * 8, MCFixupKindInfo::FKF_IsPCRel },        { "reloc_riprel_4byte", 0, 4 * 8, MCFixupKindInfo::FKF_IsPCRel },        { "reloc_riprel_4byte_movq_load", 0, 4 * 8, MCFixupKindInfo::FKF_IsPCRel }, -      { "reloc_signed_4byte", 0, 4 * 8, 0} +      { "reloc_signed_4byte", 0, 4 * 8, 0}, +      { "reloc_global_offset_table", 0, 4 * 8, 0}      };      if (Kind < FirstTargetFixupKind) @@ -229,10 +230,10 @@ EmitImmediate(const MCOperand &DispOp, unsigned Size, MCFixupKind FixupKind,    // If we have an immoffset, add it to the expression.    const MCExpr *Expr = DispOp.getExpr(); -  if (StartsWithGlobalOffsetTable(Expr)) { -    // FIXME: We should probably change the FixupKind to a special one so that -    // other parts of MC don't have to check the symbol name. +  if (FixupKind == FK_Data_4 && StartsWithGlobalOffsetTable(Expr)) {      assert(ImmOffset == 0); + +    FixupKind = MCFixupKind(X86::reloc_global_offset_table);      ImmOffset = CurByte;    }  | 

