mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-10-02 17:55:18 +00:00
MC: Support COFF image-relative MCSymbolRefs
Add support for the COFF relocation types IMAGE_REL_I386_DIR32NB and IMAGE_REL_AMD64_ADDR32NB for 32- and 64-bit respectively. These are similar to normal 4-byte relocations except that they do not include the base address of the image. Image-relative relocations are used for debug information (32-bit) and SEH unwind tables (64-bit). A new MCSymbolRef variant called 'VK_COFF_IMGREL32' is introduced to specify such relocations. For AT&T assembly, this variant can be accessed using the symbol suffix '@imgrel'. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@179240 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
bb5cbd86a4
commit
18d49acdab
39
docs/Extensions.rst
Normal file
39
docs/Extensions.rst
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
===============
|
||||||
|
LLVM Extensions
|
||||||
|
===============
|
||||||
|
|
||||||
|
.. contents::
|
||||||
|
:local:
|
||||||
|
:depth: 1
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:hidden:
|
||||||
|
|
||||||
|
Introduction
|
||||||
|
============
|
||||||
|
|
||||||
|
This document describes extensions to tools and formats LLVM seeks compatibility
|
||||||
|
with.
|
||||||
|
|
||||||
|
Machine-specific Assembly Syntax
|
||||||
|
================================
|
||||||
|
|
||||||
|
X86/COFF-Dependent
|
||||||
|
------------------
|
||||||
|
|
||||||
|
The following additional relocation type is supported:
|
||||||
|
|
||||||
|
**@IMGREL** (AT&T syntax only) generates an image-relative relocation that
|
||||||
|
corresponds to the COFF relocation types ``IMAGE_REL_I386_DIR32NB`` (32-bit) or
|
||||||
|
``IMAGE_REL_AMD64_ADDR32NB`` (64-bit).
|
||||||
|
|
||||||
|
.. code-block:: gas
|
||||||
|
|
||||||
|
.text
|
||||||
|
fun:
|
||||||
|
mov foo@IMGREL(%ebx, %ecx, 4), %eax
|
||||||
|
|
||||||
|
.section .pdata
|
||||||
|
.long fun@IMGREL
|
||||||
|
.long (fun@imgrel + 0x3F)
|
||||||
|
.long $unwind$fun@imgrel
|
@ -160,6 +160,7 @@ For developers of applications which use LLVM as a library.
|
|||||||
ExtendingLLVM
|
ExtendingLLVM
|
||||||
HowToSetUpLLVMStyleRTTI
|
HowToSetUpLLVMStyleRTTI
|
||||||
ProgrammersManual
|
ProgrammersManual
|
||||||
|
Extensions
|
||||||
|
|
||||||
:doc:`LLVM Language Reference Manual <LangRef>`
|
:doc:`LLVM Language Reference Manual <LangRef>`
|
||||||
Defines the LLVM intermediate representation and the assembly form of the
|
Defines the LLVM intermediate representation and the assembly form of the
|
||||||
@ -172,6 +173,9 @@ For developers of applications which use LLVM as a library.
|
|||||||
Introduction to the general layout of the LLVM sourcebase, important classes
|
Introduction to the general layout of the LLVM sourcebase, important classes
|
||||||
and APIs, and some tips & tricks.
|
and APIs, and some tips & tricks.
|
||||||
|
|
||||||
|
:doc:`Extensions`
|
||||||
|
LLVM-specific extensions to tools and formats LLVM seeks compatibility with.
|
||||||
|
|
||||||
:doc:`CommandLine`
|
:doc:`CommandLine`
|
||||||
Provides information on using the command line parsing library.
|
Provides information on using the command line parsing library.
|
||||||
|
|
||||||
|
@ -216,7 +216,9 @@ public:
|
|||||||
VK_Mips_GOT_HI16,
|
VK_Mips_GOT_HI16,
|
||||||
VK_Mips_GOT_LO16,
|
VK_Mips_GOT_LO16,
|
||||||
VK_Mips_CALL_HI16,
|
VK_Mips_CALL_HI16,
|
||||||
VK_Mips_CALL_LO16
|
VK_Mips_CALL_LO16,
|
||||||
|
|
||||||
|
VK_COFF_IMGREL32 // symbol@imgrel (image-relative)
|
||||||
};
|
};
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -11,7 +11,9 @@
|
|||||||
#define LLVM_MC_MCWINCOFFOBJECTWRITER_H
|
#define LLVM_MC_MCWINCOFFOBJECTWRITER_H
|
||||||
|
|
||||||
namespace llvm {
|
namespace llvm {
|
||||||
|
class MCFixup;
|
||||||
class MCObjectWriter;
|
class MCObjectWriter;
|
||||||
|
class MCValue;
|
||||||
class raw_ostream;
|
class raw_ostream;
|
||||||
|
|
||||||
class MCWinCOFFObjectTargetWriter {
|
class MCWinCOFFObjectTargetWriter {
|
||||||
@ -24,7 +26,9 @@ namespace llvm {
|
|||||||
virtual ~MCWinCOFFObjectTargetWriter() {}
|
virtual ~MCWinCOFFObjectTargetWriter() {}
|
||||||
|
|
||||||
unsigned getMachine() const { return Machine; }
|
unsigned getMachine() const { return Machine; }
|
||||||
virtual unsigned getRelocType(unsigned FixupKind) const = 0;
|
virtual unsigned getRelocType(const MCValue &Target,
|
||||||
|
const MCFixup &Fixup,
|
||||||
|
bool IsCrossSection) const = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
/// \brief Construct a new Win COFF writer instance.
|
/// \brief Construct a new Win COFF writer instance.
|
||||||
|
@ -250,6 +250,7 @@ StringRef MCSymbolRefExpr::getVariantKindName(VariantKind Kind) {
|
|||||||
case VK_Mips_GOT_LO16: return "GOT_LO16";
|
case VK_Mips_GOT_LO16: return "GOT_LO16";
|
||||||
case VK_Mips_CALL_HI16: return "CALL_HI16";
|
case VK_Mips_CALL_HI16: return "CALL_HI16";
|
||||||
case VK_Mips_CALL_LO16: return "CALL_LO16";
|
case VK_Mips_CALL_LO16: return "CALL_LO16";
|
||||||
|
case VK_COFF_IMGREL32: return "IMGREL32";
|
||||||
}
|
}
|
||||||
llvm_unreachable("Invalid variant kind");
|
llvm_unreachable("Invalid variant kind");
|
||||||
}
|
}
|
||||||
@ -285,6 +286,8 @@ MCSymbolRefExpr::getVariantKindForName(StringRef Name) {
|
|||||||
.Case("dtpoff", VK_DTPOFF)
|
.Case("dtpoff", VK_DTPOFF)
|
||||||
.Case("TLVP", VK_TLVP)
|
.Case("TLVP", VK_TLVP)
|
||||||
.Case("tlvp", VK_TLVP)
|
.Case("tlvp", VK_TLVP)
|
||||||
|
.Case("IMGREL", VK_COFF_IMGREL32)
|
||||||
|
.Case("imgrel", VK_COFF_IMGREL32)
|
||||||
.Default(VK_Invalid);
|
.Default(VK_Invalid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -689,13 +689,8 @@ void WinCOFFObjectWriter::RecordRelocation(const MCAssembler &Asm,
|
|||||||
++Reloc.Symb->Relocations;
|
++Reloc.Symb->Relocations;
|
||||||
|
|
||||||
Reloc.Data.VirtualAddress += Fixup.getOffset();
|
Reloc.Data.VirtualAddress += Fixup.getOffset();
|
||||||
|
Reloc.Data.Type = TargetObjectWriter->getRelocType(Target, Fixup,
|
||||||
unsigned FixupKind = Fixup.getKind();
|
CrossSection);
|
||||||
|
|
||||||
if (CrossSection)
|
|
||||||
FixupKind = FK_PCRel_4;
|
|
||||||
|
|
||||||
Reloc.Data.Type = TargetObjectWriter->getRelocType(FixupKind);
|
|
||||||
|
|
||||||
// FIXME: Can anyone explain what this does other than adjust for the size
|
// FIXME: Can anyone explain what this does other than adjust for the size
|
||||||
// of the offset?
|
// of the offset?
|
||||||
|
@ -9,6 +9,8 @@
|
|||||||
|
|
||||||
#include "MCTargetDesc/X86FixupKinds.h"
|
#include "MCTargetDesc/X86FixupKinds.h"
|
||||||
#include "MCTargetDesc/X86MCTargetDesc.h"
|
#include "MCTargetDesc/X86MCTargetDesc.h"
|
||||||
|
#include "llvm/MC/MCExpr.h"
|
||||||
|
#include "llvm/MC/MCValue.h"
|
||||||
#include "llvm/MC/MCWinCOFFObjectWriter.h"
|
#include "llvm/MC/MCWinCOFFObjectWriter.h"
|
||||||
#include "llvm/Support/COFF.h"
|
#include "llvm/Support/COFF.h"
|
||||||
#include "llvm/Support/ErrorHandling.h"
|
#include "llvm/Support/ErrorHandling.h"
|
||||||
@ -27,7 +29,9 @@ namespace {
|
|||||||
X86WinCOFFObjectWriter(bool Is64Bit_);
|
X86WinCOFFObjectWriter(bool Is64Bit_);
|
||||||
~X86WinCOFFObjectWriter();
|
~X86WinCOFFObjectWriter();
|
||||||
|
|
||||||
virtual unsigned getRelocType(unsigned FixupKind) const;
|
virtual unsigned getRelocType(const MCValue &Target,
|
||||||
|
const MCFixup &Fixup,
|
||||||
|
bool IsCrossSection) const LLVM_OVERRIDE;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -38,7 +42,14 @@ X86WinCOFFObjectWriter::X86WinCOFFObjectWriter(bool Is64Bit_)
|
|||||||
|
|
||||||
X86WinCOFFObjectWriter::~X86WinCOFFObjectWriter() {}
|
X86WinCOFFObjectWriter::~X86WinCOFFObjectWriter() {}
|
||||||
|
|
||||||
unsigned X86WinCOFFObjectWriter::getRelocType(unsigned FixupKind) const {
|
unsigned X86WinCOFFObjectWriter::getRelocType(const MCValue &Target,
|
||||||
|
const MCFixup &Fixup,
|
||||||
|
bool IsCrossSection) const {
|
||||||
|
unsigned FixupKind = IsCrossSection ? FK_PCRel_4 : Fixup.getKind();
|
||||||
|
|
||||||
|
MCSymbolRefExpr::VariantKind Modifier = Target.isAbsolute() ?
|
||||||
|
MCSymbolRefExpr::VK_None : Target.getSymA()->getKind();
|
||||||
|
|
||||||
switch (FixupKind) {
|
switch (FixupKind) {
|
||||||
case FK_PCRel_4:
|
case FK_PCRel_4:
|
||||||
case X86::reloc_riprel_4byte:
|
case X86::reloc_riprel_4byte:
|
||||||
@ -46,6 +57,9 @@ unsigned X86WinCOFFObjectWriter::getRelocType(unsigned FixupKind) const {
|
|||||||
return Is64Bit ? COFF::IMAGE_REL_AMD64_REL32 : COFF::IMAGE_REL_I386_REL32;
|
return Is64Bit ? COFF::IMAGE_REL_AMD64_REL32 : COFF::IMAGE_REL_I386_REL32;
|
||||||
case FK_Data_4:
|
case FK_Data_4:
|
||||||
case X86::reloc_signed_4byte:
|
case X86::reloc_signed_4byte:
|
||||||
|
if (Modifier == MCSymbolRefExpr::VK_COFF_IMGREL32)
|
||||||
|
return Is64Bit ? COFF::IMAGE_REL_AMD64_ADDR32NB :
|
||||||
|
COFF::IMAGE_REL_I386_DIR32NB;
|
||||||
return Is64Bit ? COFF::IMAGE_REL_AMD64_ADDR32 : COFF::IMAGE_REL_I386_DIR32;
|
return Is64Bit ? COFF::IMAGE_REL_AMD64_ADDR32 : COFF::IMAGE_REL_I386_DIR32;
|
||||||
case FK_Data_8:
|
case FK_Data_8:
|
||||||
if (Is64Bit)
|
if (Is64Bit)
|
||||||
|
29
test/MC/COFF/relocation-imgrel.s
Normal file
29
test/MC/COFF/relocation-imgrel.s
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
// COFF Image-relative relocations
|
||||||
|
//
|
||||||
|
// Test that we produce image-relative relocations (IMAGE_REL_I386_DIR32NB
|
||||||
|
// and IMAGE_REL_AMD64_ADDR32NB) when accessing foo@imgrel.
|
||||||
|
|
||||||
|
// RUN: llvm-mc -filetype=obj -triple i686-pc-win32 %s | llvm-readobj -r | FileCheck --check-prefix=W32 %s
|
||||||
|
// RUN: llvm-mc -filetype=obj -triple x86_64-pc-win32 %s | llvm-readobj -r | FileCheck --check-prefix=W64 %s
|
||||||
|
|
||||||
|
.data
|
||||||
|
foo:
|
||||||
|
.long 1
|
||||||
|
|
||||||
|
.text
|
||||||
|
mov foo@IMGREL(%ebx, %ecx, 4), %eax
|
||||||
|
mov foo@imgrel(%ebx, %ecx, 4), %eax
|
||||||
|
|
||||||
|
// W32: Relocations [
|
||||||
|
// W32-NEXT: Section (1) .text {
|
||||||
|
// W32-NEXT: 0x3 IMAGE_REL_I386_DIR32NB foo
|
||||||
|
// W32-NEXT: 0xA IMAGE_REL_I386_DIR32NB foo
|
||||||
|
// W32-NEXT: }
|
||||||
|
// W32-NEXT: ]
|
||||||
|
|
||||||
|
// W64: Relocations [
|
||||||
|
// W64-NEXT: Section (1) .text {
|
||||||
|
// W64-NEXT: 0x4 IMAGE_REL_AMD64_ADDR32NB foo
|
||||||
|
// W64-NEXT: 0xC IMAGE_REL_AMD64_ADDR32NB foo
|
||||||
|
// W64-NEXT: }
|
||||||
|
// W64-NEXT: ]
|
Loading…
Reference in New Issue
Block a user