LLVM
15.0.0git
lib
Target
X86
MCTargetDesc
X86WinCOFFObjectWriter.cpp
Go to the documentation of this file.
1
//===-- X86WinCOFFObjectWriter.cpp - X86 Win COFF Writer ------------------===//
2
//
3
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4
// See https://llvm.org/LICENSE.txt for license information.
5
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6
//
7
//===----------------------------------------------------------------------===//
8
9
#include "
MCTargetDesc/X86FixupKinds.h
"
10
#include "
MCTargetDesc/X86MCTargetDesc.h
"
11
#include "
llvm/BinaryFormat/COFF.h
"
12
#include "
llvm/MC/MCContext.h
"
13
#include "
llvm/MC/MCExpr.h
"
14
#include "
llvm/MC/MCFixup.h
"
15
#include "
llvm/MC/MCObjectWriter.h
"
16
#include "
llvm/MC/MCValue.h
"
17
#include "
llvm/MC/MCWinCOFFObjectWriter.h
"
18
#include "
llvm/Support/ErrorHandling.h
"
19
20
using namespace
llvm
;
21
22
namespace
{
23
24
class
X86WinCOFFObjectWriter :
public
MCWinCOFFObjectTargetWriter
{
25
public
:
26
X86WinCOFFObjectWriter(
bool
Is64Bit);
27
~X86WinCOFFObjectWriter()
override
=
default
;
28
29
unsigned
getRelocType(
MCContext
&Ctx,
const
MCValue
&
Target
,
30
const
MCFixup
&Fixup,
bool
IsCrossSection,
31
const
MCAsmBackend
&MAB)
const override
;
32
};
33
34
}
// end anonymous namespace
35
36
X86WinCOFFObjectWriter::X86WinCOFFObjectWriter(
bool
Is64Bit)
37
:
MCWinCOFFObjectTargetWriter
(Is64Bit ? COFF::
IMAGE_FILE_MACHINE_AMD64
38
: COFF::
IMAGE_FILE_MACHINE_I386
) {}
39
40
unsigned
X86WinCOFFObjectWriter::getRelocType(
MCContext
&Ctx,
41
const
MCValue
&
Target
,
42
const
MCFixup
&Fixup,
43
bool
IsCrossSection,
44
const
MCAsmBackend
&MAB)
const
{
45
const
bool
Is64Bit = getMachine() ==
COFF::IMAGE_FILE_MACHINE_AMD64
;
46
unsigned
FixupKind
=
Fixup
.getKind();
47
if
(IsCrossSection) {
48
// IMAGE_REL_AMD64_REL64 does not exist. We treat FK_Data_8 as FK_PCRel_4 so
49
// that .quad a-b can lower to IMAGE_REL_AMD64_REL32. This allows generic
50
// instrumentation to not bother with the COFF limitation. A negative value
51
// needs attention.
52
if
(
FixupKind
==
FK_Data_4
||
FixupKind
==
llvm::X86::reloc_signed_4byte
||
53
(
FixupKind
==
FK_Data_8
&& Is64Bit)) {
54
FixupKind
=
FK_PCRel_4
;
55
}
else
{
56
Ctx.
reportError
(
Fixup
.getLoc(),
"Cannot represent this expression"
);
57
return
COFF::IMAGE_REL_AMD64_ADDR32
;
58
}
59
}
60
61
MCSymbolRefExpr::VariantKind
Modifier =
Target
.isAbsolute() ?
62
MCSymbolRefExpr::VK_None
:
Target
.getSymA()->getKind();
63
64
if
(Is64Bit) {
65
switch
(
FixupKind
) {
66
case
FK_PCRel_4
:
67
case
X86::reloc_riprel_4byte
:
68
case
X86::reloc_riprel_4byte_movq_load
:
69
case
X86::reloc_riprel_4byte_relax
:
70
case
X86::reloc_riprel_4byte_relax_rex
:
71
case
X86::reloc_branch_4byte_pcrel
:
72
return
COFF::IMAGE_REL_AMD64_REL32
;
73
case
FK_Data_4
:
74
case
X86::reloc_signed_4byte
:
75
case
X86::reloc_signed_4byte_relax
:
76
if
(Modifier ==
MCSymbolRefExpr::VK_COFF_IMGREL32
)
77
return
COFF::IMAGE_REL_AMD64_ADDR32NB
;
78
if
(Modifier ==
MCSymbolRefExpr::VK_SECREL
)
79
return
COFF::IMAGE_REL_AMD64_SECREL
;
80
return
COFF::IMAGE_REL_AMD64_ADDR32
;
81
case
FK_Data_8
:
82
return
COFF::IMAGE_REL_AMD64_ADDR64
;
83
case
FK_SecRel_2
:
84
return
COFF::IMAGE_REL_AMD64_SECTION
;
85
case
FK_SecRel_4
:
86
return
COFF::IMAGE_REL_AMD64_SECREL
;
87
default
:
88
Ctx.
reportError
(
Fixup
.getLoc(),
"unsupported relocation type"
);
89
return
COFF::IMAGE_REL_AMD64_ADDR32
;
90
}
91
}
else
if
(getMachine() ==
COFF::IMAGE_FILE_MACHINE_I386
) {
92
switch
(
FixupKind
) {
93
case
FK_PCRel_4
:
94
case
X86::reloc_riprel_4byte
:
95
case
X86::reloc_riprel_4byte_movq_load
:
96
return
COFF::IMAGE_REL_I386_REL32
;
97
case
FK_Data_4
:
98
case
X86::reloc_signed_4byte
:
99
case
X86::reloc_signed_4byte_relax
:
100
if
(Modifier ==
MCSymbolRefExpr::VK_COFF_IMGREL32
)
101
return
COFF::IMAGE_REL_I386_DIR32NB
;
102
if
(Modifier ==
MCSymbolRefExpr::VK_SECREL
)
103
return
COFF::IMAGE_REL_I386_SECREL
;
104
return
COFF::IMAGE_REL_I386_DIR32
;
105
case
FK_SecRel_2
:
106
return
COFF::IMAGE_REL_I386_SECTION
;
107
case
FK_SecRel_4
:
108
return
COFF::IMAGE_REL_I386_SECREL
;
109
default
:
110
Ctx.
reportError
(
Fixup
.getLoc(),
"unsupported relocation type"
);
111
return
COFF::IMAGE_REL_I386_DIR32
;
112
}
113
}
else
114
llvm_unreachable
(
"Unsupported COFF machine type."
);
115
}
116
117
std::unique_ptr<MCObjectTargetWriter>
118
llvm::createX86WinCOFFObjectWriter
(
bool
Is64Bit) {
119
return
std::make_unique<X86WinCOFFObjectWriter>(Is64Bit);
120
}
llvm::COFF::IMAGE_REL_I386_SECTION
@ IMAGE_REL_I386_SECTION
Definition:
COFF.h:337
llvm::COFF::IMAGE_REL_AMD64_ADDR32
@ IMAGE_REL_AMD64_ADDR32
Definition:
COFF.h:347
llvm
This is an optimization pass for GlobalISel generic memory operations.
Definition:
AddressRanges.h:17
llvm::FixupKind
static Lanai::Fixups FixupKind(const MCExpr *Expr)
Definition:
LanaiMCCodeEmitter.cpp:90
llvm::MCContext
Context object for machine code objects.
Definition:
MCContext.h:76
llvm::Target
Target - Wrapper for Target specific information.
Definition:
TargetRegistry.h:145
ErrorHandling.h
llvm::COFF::IMAGE_FILE_MACHINE_AMD64
@ IMAGE_FILE_MACHINE_AMD64
Definition:
COFF.h:97
COFF.h
llvm::COFF::IMAGE_REL_I386_DIR32NB
@ IMAGE_REL_I386_DIR32NB
Definition:
COFF.h:335
llvm::COFF::IMAGE_REL_AMD64_REL32
@ IMAGE_REL_AMD64_REL32
Definition:
COFF.h:349
llvm::createX86WinCOFFObjectWriter
std::unique_ptr< MCObjectTargetWriter > createX86WinCOFFObjectWriter(bool Is64Bit)
Construct an X86 Win COFF object writer.
Definition:
X86WinCOFFObjectWriter.cpp:118
llvm::X86::reloc_riprel_4byte
@ reloc_riprel_4byte
Definition:
X86FixupKinds.h:17
llvm::X86::reloc_signed_4byte_relax
@ reloc_signed_4byte_relax
Definition:
X86FixupKinds.h:26
llvm::FK_Data_4
@ FK_Data_4
A four-byte fixup.
Definition:
MCFixup.h:25
llvm::COFF::IMAGE_FILE_MACHINE_I386
@ IMAGE_FILE_MACHINE_I386
Definition:
COFF.h:102
llvm::MCAsmBackend
Generic interface to target specific assembler backends.
Definition:
MCAsmBackend.h:42
llvm::FK_SecRel_4
@ FK_SecRel_4
A four-byte section relative fixup.
Definition:
MCFixup.h:42
MCContext.h
llvm::FK_SecRel_2
@ FK_SecRel_2
A two-byte section relative fixup.
Definition:
MCFixup.h:41
llvm::COFF::IMAGE_REL_I386_DIR32
@ IMAGE_REL_I386_DIR32
Definition:
COFF.h:334
llvm::X86::reloc_signed_4byte
@ reloc_signed_4byte
Definition:
X86FixupKinds.h:23
X86MCTargetDesc.h
llvm::MCSymbolRefExpr::VariantKind
VariantKind
Definition:
MCExpr.h:194
llvm::COFF::IMAGE_REL_I386_REL32
@ IMAGE_REL_I386_REL32
Definition:
COFF.h:341
llvm::COFF::IMAGE_REL_AMD64_ADDR64
@ IMAGE_REL_AMD64_ADDR64
Definition:
COFF.h:346
llvm::MCContext::reportError
void reportError(SMLoc L, const Twine &Msg)
Definition:
MCContext.cpp:1037
llvm::FK_PCRel_4
@ FK_PCRel_4
A four-byte pc relative fixup.
Definition:
MCFixup.h:30
Fixup
PowerPC TLS Dynamic Call Fixup
Definition:
PPCTLSDynamicCall.cpp:215
llvm_unreachable
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
Definition:
ErrorHandling.h:143
MCFixup.h
llvm::MCWinCOFFObjectTargetWriter
Definition:
MCWinCOFFObjectWriter.h:23
llvm::COFF::IMAGE_REL_AMD64_SECREL
@ IMAGE_REL_AMD64_SECREL
Definition:
COFF.h:356
llvm::X86::reloc_riprel_4byte_relax
@ reloc_riprel_4byte_relax
Definition:
X86FixupKinds.h:19
MCObjectWriter.h
llvm::X86::reloc_riprel_4byte_movq_load
@ reloc_riprel_4byte_movq_load
Definition:
X86FixupKinds.h:18
llvm::COFF::IMAGE_REL_AMD64_ADDR32NB
@ IMAGE_REL_AMD64_ADDR32NB
Definition:
COFF.h:348
llvm::MCSymbolRefExpr::VK_COFF_IMGREL32
@ VK_COFF_IMGREL32
Definition:
MCExpr.h:316
MCValue.h
llvm::COFF::IMAGE_REL_I386_SECREL
@ IMAGE_REL_I386_SECREL
Definition:
COFF.h:338
llvm::FK_Data_8
@ FK_Data_8
A eight-byte fixup.
Definition:
MCFixup.h:26
llvm::COFF::IMAGE_REL_AMD64_SECTION
@ IMAGE_REL_AMD64_SECTION
Definition:
COFF.h:355
llvm::MCValue
This represents an "assembler immediate".
Definition:
MCValue.h:36
llvm::MCSymbolRefExpr::VK_None
@ VK_None
Definition:
MCExpr.h:195
MCWinCOFFObjectWriter.h
llvm::X86::reloc_riprel_4byte_relax_rex
@ reloc_riprel_4byte_relax_rex
Definition:
X86FixupKinds.h:21
MCExpr.h
llvm::MCFixup
Encode information on a single operation to perform on a byte sequence (e.g., an encoded instruction)...
Definition:
MCFixup.h:71
llvm::X86::reloc_branch_4byte_pcrel
@ reloc_branch_4byte_pcrel
Definition:
X86FixupKinds.h:32
llvm::MCSymbolRefExpr::VK_SECREL
@ VK_SECREL
Definition:
MCExpr.h:223
X86FixupKinds.h
Generated on Wed Jul 6 2022 03:57:06 for LLVM by
1.8.17