LLVM
15.0.0git
lib
Target
ARM
MCTargetDesc
ARMWinCOFFObjectWriter.cpp
Go to the documentation of this file.
1
//===-- ARMWinCOFFObjectWriter.cpp - ARM Windows COFF Object Writer -- C++ -==//
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/ARMFixupKinds.h
"
10
#include "
llvm/ADT/Twine.h
"
11
#include "
llvm/BinaryFormat/COFF.h
"
12
#include "
llvm/MC/MCAsmBackend.h
"
13
#include "
llvm/MC/MCContext.h
"
14
#include "
llvm/MC/MCExpr.h
"
15
#include "
llvm/MC/MCFixup.h
"
16
#include "
llvm/MC/MCFixupKindInfo.h
"
17
#include "
llvm/MC/MCObjectWriter.h
"
18
#include "
llvm/MC/MCValue.h
"
19
#include "
llvm/MC/MCWinCOFFObjectWriter.h
"
20
#include "
llvm/Support/ErrorHandling.h
"
21
#include "
llvm/Support/raw_ostream.h
"
22
#include <cassert>
23
24
using namespace
llvm
;
25
26
namespace
{
27
28
class
ARMWinCOFFObjectWriter :
public
MCWinCOFFObjectTargetWriter
{
29
public
:
30
ARMWinCOFFObjectWriter()
31
:
MCWinCOFFObjectTargetWriter
(COFF::
IMAGE_FILE_MACHINE_ARMNT
) {
32
}
33
34
~ARMWinCOFFObjectWriter()
override
=
default
;
35
36
unsigned
getRelocType(
MCContext
&Ctx,
const
MCValue
&
Target
,
37
const
MCFixup
&Fixup,
bool
IsCrossSection,
38
const
MCAsmBackend
&MAB)
const override
;
39
40
bool
recordRelocation(
const
MCFixup
&)
const override
;
41
};
42
43
}
// end anonymous namespace
44
45
unsigned
ARMWinCOFFObjectWriter::getRelocType(
MCContext
&Ctx,
46
const
MCValue
&
Target
,
47
const
MCFixup
&Fixup,
48
bool
IsCrossSection,
49
const
MCAsmBackend
&MAB)
const
{
50
MCSymbolRefExpr::VariantKind
Modifier =
51
Target
.isAbsolute() ?
MCSymbolRefExpr::VK_None
:
Target
.getSymA()->getKind();
52
53
unsigned
FixupKind
=
Fixup
.getKind();
54
if
(IsCrossSection) {
55
if
(
FixupKind
!=
FK_Data_4
) {
56
Ctx.
reportError
(
Fixup
.getLoc(),
"Cannot represent this expression"
);
57
return
COFF::IMAGE_REL_ARM_ADDR32
;
58
}
59
FixupKind
=
FK_PCRel_4
;
60
}
61
62
63
switch
(
FixupKind
) {
64
default
: {
65
const
MCFixupKindInfo
&
Info
= MAB.
getFixupKindInfo
(
Fixup
.getKind());
66
report_fatal_error
(
Twine
(
"unsupported relocation type: "
) +
Info
.Name);
67
}
68
case
FK_Data_4
:
69
switch
(Modifier) {
70
case
MCSymbolRefExpr::VK_COFF_IMGREL32
:
71
return
COFF::IMAGE_REL_ARM_ADDR32NB
;
72
case
MCSymbolRefExpr::VK_SECREL
:
73
return
COFF::IMAGE_REL_ARM_SECREL
;
74
default
:
75
return
COFF::IMAGE_REL_ARM_ADDR32
;
76
}
77
case
FK_PCRel_4
:
78
return
COFF::IMAGE_REL_ARM_REL32
;
79
case
FK_SecRel_2
:
80
return
COFF::IMAGE_REL_ARM_SECTION
;
81
case
FK_SecRel_4
:
82
return
COFF::IMAGE_REL_ARM_SECREL
;
83
case
ARM::fixup_t2_condbranch
:
84
return
COFF::IMAGE_REL_ARM_BRANCH20T
;
85
case
ARM::fixup_t2_uncondbranch
:
86
case
ARM::fixup_arm_thumb_bl
:
87
return
COFF::IMAGE_REL_ARM_BRANCH24T
;
88
case
ARM::fixup_arm_thumb_blx
:
89
return
COFF::IMAGE_REL_ARM_BLX23T
;
90
case
ARM::fixup_t2_movw_lo16
:
91
case
ARM::fixup_t2_movt_hi16
:
92
return
COFF::IMAGE_REL_ARM_MOV32T
;
93
}
94
}
95
96
bool
ARMWinCOFFObjectWriter::recordRelocation(
const
MCFixup
&Fixup)
const
{
97
return
static_cast<
unsigned
>
(
Fixup
.getKind()) !=
ARM::fixup_t2_movt_hi16
;
98
}
99
100
namespace
llvm
{
101
102
std::unique_ptr<MCObjectTargetWriter>
103
createARMWinCOFFObjectWriter
() {
104
return
std::make_unique<ARMWinCOFFObjectWriter>();
105
}
106
107
}
// end namespace llvm
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::MCAsmBackend::getFixupKindInfo
virtual const MCFixupKindInfo & getFixupKindInfo(MCFixupKind Kind) const
Get information on a fixup kind.
Definition:
MCAsmBackend.cpp:82
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
COFF.h
llvm::COFF::IMAGE_FILE_MACHINE_ARMNT
@ IMAGE_FILE_MACHINE_ARMNT
Definition:
COFF.h:99
MCFixupKindInfo.h
llvm::COFF::IMAGE_REL_ARM_BRANCH20T
@ IMAGE_REL_ARM_BRANCH20T
Definition:
COFF.h:378
llvm::ARM::fixup_t2_uncondbranch
@ fixup_t2_uncondbranch
Definition:
ARMFixupKinds.h:57
ARMFixupKinds.h
llvm::COFF::IMAGE_REL_ARM_SECREL
@ IMAGE_REL_ARM_SECREL
Definition:
COFF.h:375
llvm::FK_Data_4
@ FK_Data_4
A four-byte fixup.
Definition:
MCFixup.h:25
llvm::MCAsmBackend
Generic interface to target specific assembler backends.
Definition:
MCAsmBackend.h:42
MCAsmBackend.h
llvm::COFF::IMAGE_REL_ARM_MOV32T
@ IMAGE_REL_ARM_MOV32T
Definition:
COFF.h:377
llvm::FK_SecRel_4
@ FK_SecRel_4
A four-byte section relative fixup.
Definition:
MCFixup.h:42
Twine.h
MCContext.h
llvm::FK_SecRel_2
@ FK_SecRel_2
A two-byte section relative fixup.
Definition:
MCFixup.h:41
llvm::COFF::IMAGE_REL_ARM_ADDR32NB
@ IMAGE_REL_ARM_ADDR32NB
Definition:
COFF.h:367
llvm::report_fatal_error
void report_fatal_error(Error Err, bool gen_crash_diag=true)
Report a serious error, calling any installed error handler.
Definition:
Error.cpp:143
Info
Analysis containing CSE Info
Definition:
CSEInfo.cpp:27
llvm::ARM::fixup_arm_thumb_bl
@ fixup_arm_thumb_bl
Definition:
ARMFixupKinds.h:81
llvm::MCSymbolRefExpr::VariantKind
VariantKind
Definition:
MCExpr.h:194
llvm::COFF::IMAGE_REL_ARM_BRANCH24T
@ IMAGE_REL_ARM_BRANCH24T
Definition:
COFF.h:379
llvm::ARM::fixup_arm_thumb_blx
@ fixup_arm_thumb_blx
Definition:
ARMFixupKinds.h:84
llvm::ARM::fixup_t2_movt_hi16
@ fixup_t2_movt_hi16
Definition:
ARMFixupKinds.h:99
llvm::MCFixupKindInfo
Target independent information on a fixup kind.
Definition:
MCFixupKindInfo.h:15
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:233
MCFixup.h
llvm::MCWinCOFFObjectTargetWriter
Definition:
MCWinCOFFObjectWriter.h:23
llvm::COFF::IMAGE_REL_ARM_REL32
@ IMAGE_REL_ARM_REL32
Definition:
COFF.h:373
llvm::COFF::IMAGE_REL_ARM_SECTION
@ IMAGE_REL_ARM_SECTION
Definition:
COFF.h:374
MCObjectWriter.h
llvm::Twine
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition:
Twine.h:83
llvm::ARM::fixup_t2_movw_lo16
@ fixup_t2_movw_lo16
Definition:
ARMFixupKinds.h:100
llvm::createARMWinCOFFObjectWriter
std::unique_ptr< MCObjectTargetWriter > createARMWinCOFFObjectWriter()
Construct an ARM PE/COFF object writer.
Definition:
ARMWinCOFFObjectWriter.cpp:103
llvm::COFF::IMAGE_REL_ARM_BLX23T
@ IMAGE_REL_ARM_BLX23T
Definition:
COFF.h:380
llvm::ARM::fixup_t2_condbranch
@ fixup_t2_condbranch
Definition:
ARMFixupKinds.h:54
llvm::MCSymbolRefExpr::VK_COFF_IMGREL32
@ VK_COFF_IMGREL32
Definition:
MCExpr.h:316
MCValue.h
llvm::MCValue
This represents an "assembler immediate".
Definition:
MCValue.h:36
llvm::MCSymbolRefExpr::VK_None
@ VK_None
Definition:
MCExpr.h:195
MCWinCOFFObjectWriter.h
raw_ostream.h
llvm::COFF::IMAGE_REL_ARM_ADDR32
@ IMAGE_REL_ARM_ADDR32
Definition:
COFF.h:366
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::MCSymbolRefExpr::VK_SECREL
@ VK_SECREL
Definition:
MCExpr.h:223
Generated on Sat Jul 2 2022 14:23:01 for LLVM by
1.8.17