diff options
Diffstat (limited to 'lib/Target/X86/MCTargetDesc/X86ELFObjectWriter.cpp')
-rw-r--r-- | lib/Target/X86/MCTargetDesc/X86ELFObjectWriter.cpp | 38 |
1 files changed, 32 insertions, 6 deletions
diff --git a/lib/Target/X86/MCTargetDesc/X86ELFObjectWriter.cpp b/lib/Target/X86/MCTargetDesc/X86ELFObjectWriter.cpp index b724a89f81d2..232a06593238 100644 --- a/lib/Target/X86/MCTargetDesc/X86ELFObjectWriter.cpp +++ b/lib/Target/X86/MCTargetDesc/X86ELFObjectWriter.cpp @@ -1,9 +1,8 @@ //===-- X86ELFObjectWriter.cpp - X86 ELF Writer ---------------------------===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// @@ -45,7 +44,7 @@ X86ELFObjectWriter::X86ELFObjectWriter(bool IsELF64, uint8_t OSABI, (EMachine != ELF::EM_386) && (EMachine != ELF::EM_IAMCU)) {} -enum X86_64RelType { RT64_64, RT64_32, RT64_32S, RT64_16, RT64_8 }; +enum X86_64RelType { RT64_NONE, RT64_64, RT64_32, RT64_32S, RT64_16, RT64_8 }; static X86_64RelType getType64(unsigned Kind, MCSymbolRefExpr::VariantKind &Modifier, @@ -53,6 +52,8 @@ static X86_64RelType getType64(unsigned Kind, switch (Kind) { default: llvm_unreachable("Unimplemented"); + case FK_NONE: + return RT64_NONE; case X86::reloc_global_offset_table8: Modifier = MCSymbolRefExpr::VK_GOT; IsPCRel = true; @@ -103,6 +104,10 @@ static unsigned getRelocType64(MCContext &Ctx, SMLoc Loc, case MCSymbolRefExpr::VK_None: case MCSymbolRefExpr::VK_X86_ABS8: switch (Type) { + case RT64_NONE: + if (Modifier == MCSymbolRefExpr::VK_None) + return ELF::R_X86_64_NONE; + llvm_unreachable("Unimplemented"); case RT64_64: return IsPCRel ? ELF::R_X86_64_PC64 : ELF::R_X86_64_64; case RT64_32: @@ -114,6 +119,7 @@ static unsigned getRelocType64(MCContext &Ctx, SMLoc Loc, case RT64_8: return IsPCRel ? ELF::R_X86_64_PC8 : ELF::R_X86_64_8; } + llvm_unreachable("unexpected relocation type!"); case MCSymbolRefExpr::VK_GOT: switch (Type) { case RT64_64: @@ -123,8 +129,10 @@ static unsigned getRelocType64(MCContext &Ctx, SMLoc Loc, case RT64_32S: case RT64_16: case RT64_8: + case RT64_NONE: llvm_unreachable("Unimplemented"); } + llvm_unreachable("unexpected relocation type!"); case MCSymbolRefExpr::VK_GOTOFF: assert(Type == RT64_64); assert(!IsPCRel); @@ -139,8 +147,10 @@ static unsigned getRelocType64(MCContext &Ctx, SMLoc Loc, case RT64_32S: case RT64_16: case RT64_8: + case RT64_NONE: llvm_unreachable("Unimplemented"); } + llvm_unreachable("unexpected relocation type!"); case MCSymbolRefExpr::VK_DTPOFF: assert(!IsPCRel); switch (Type) { @@ -151,8 +161,10 @@ static unsigned getRelocType64(MCContext &Ctx, SMLoc Loc, case RT64_32S: case RT64_16: case RT64_8: + case RT64_NONE: llvm_unreachable("Unimplemented"); } + llvm_unreachable("unexpected relocation type!"); case MCSymbolRefExpr::VK_SIZE: assert(!IsPCRel); switch (Type) { @@ -163,8 +175,10 @@ static unsigned getRelocType64(MCContext &Ctx, SMLoc Loc, case RT64_32S: case RT64_16: case RT64_8: + case RT64_NONE: llvm_unreachable("Unimplemented"); } + llvm_unreachable("unexpected relocation type!"); case MCSymbolRefExpr::VK_TLSCALL: return ELF::R_X86_64_TLSDESC_CALL; case MCSymbolRefExpr::VK_TLSDESC: @@ -197,13 +211,16 @@ static unsigned getRelocType64(MCContext &Ctx, SMLoc Loc, case X86::reloc_riprel_4byte_movq_load: return ELF::R_X86_64_REX_GOTPCRELX; } + llvm_unreachable("unexpected relocation type!"); } } -enum X86_32RelType { RT32_32, RT32_16, RT32_8 }; +enum X86_32RelType { RT32_NONE, RT32_32, RT32_16, RT32_8 }; static X86_32RelType getType32(X86_64RelType T) { switch (T) { + case RT64_NONE: + return RT32_NONE; case RT64_64: llvm_unreachable("Unimplemented"); case RT64_32: @@ -227,6 +244,10 @@ static unsigned getRelocType32(MCContext &Ctx, case MCSymbolRefExpr::VK_None: case MCSymbolRefExpr::VK_X86_ABS8: switch (Type) { + case RT32_NONE: + if (Modifier == MCSymbolRefExpr::VK_None) + return ELF::R_386_NONE; + llvm_unreachable("Unimplemented"); case RT32_32: return IsPCRel ? ELF::R_386_PC32 : ELF::R_386_32; case RT32_16: @@ -234,6 +255,7 @@ static unsigned getRelocType32(MCContext &Ctx, case RT32_8: return IsPCRel ? ELF::R_386_PC8 : ELF::R_386_8; } + llvm_unreachable("unexpected relocation type!"); case MCSymbolRefExpr::VK_GOT: assert(Type == RT32_32); if (IsPCRel) @@ -249,6 +271,10 @@ static unsigned getRelocType32(MCContext &Ctx, assert(Type == RT32_32); assert(!IsPCRel); return ELF::R_386_GOTOFF; + case MCSymbolRefExpr::VK_TLSCALL: + return ELF::R_386_TLS_DESC_CALL; + case MCSymbolRefExpr::VK_TLSDESC: + return ELF::R_386_TLS_GOTDESC; case MCSymbolRefExpr::VK_TPOFF: assert(Type == RT32_32); assert(!IsPCRel); |