/Users/buildslave/jenkins/workspace/clang-stage2-coverage-R/llvm/lib/Target/AArch64/MCTargetDesc/AArch64WinCOFFObjectWriter.cpp
Line | Count | Source (jump to first uncovered line) |
1 | | //= AArch64WinCOFFObjectWriter.cpp - AArch64 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/AArch64FixupKinds.h" |
10 | | #include "MCTargetDesc/AArch64MCExpr.h" |
11 | | #include "llvm/ADT/Twine.h" |
12 | | #include "llvm/BinaryFormat/COFF.h" |
13 | | #include "llvm/MC/MCAsmBackend.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 AArch64WinCOFFObjectWriter : public MCWinCOFFObjectTargetWriter { |
29 | | public: |
30 | | AArch64WinCOFFObjectWriter() |
31 | 91 | : MCWinCOFFObjectTargetWriter(COFF::IMAGE_FILE_MACHINE_ARM64) {} |
32 | | |
33 | 91 | ~AArch64WinCOFFObjectWriter() override = default; |
34 | | |
35 | | unsigned getRelocType(MCContext &Ctx, const MCValue &Target, |
36 | | const MCFixup &Fixup, bool IsCrossSection, |
37 | | const MCAsmBackend &MAB) const override; |
38 | | |
39 | | bool recordRelocation(const MCFixup &) const override; |
40 | | }; |
41 | | |
42 | | } // end anonymous namespace |
43 | | |
44 | | unsigned AArch64WinCOFFObjectWriter::getRelocType( |
45 | | MCContext &Ctx, const MCValue &Target, const MCFixup &Fixup, |
46 | 160 | bool IsCrossSection, const MCAsmBackend &MAB) const { |
47 | 160 | auto Modifier = Target.isAbsolute() ? MCSymbolRefExpr::VK_None0 |
48 | 160 | : Target.getSymA()->getKind(); |
49 | 160 | const MCExpr *Expr = Fixup.getValue(); |
50 | 160 | |
51 | 160 | switch (static_cast<unsigned>(Fixup.getKind())) { |
52 | 160 | default: { |
53 | 0 | const MCFixupKindInfo &Info = MAB.getFixupKindInfo(Fixup.getKind()); |
54 | 0 | report_fatal_error(Twine("unsupported relocation type: ") + Info.Name); |
55 | 160 | } |
56 | 160 | |
57 | 160 | case FK_Data_4: |
58 | 67 | switch (Modifier) { |
59 | 67 | default: |
60 | 1 | return COFF::IMAGE_REL_ARM64_ADDR32; |
61 | 67 | case MCSymbolRefExpr::VK_COFF_IMGREL32: |
62 | 66 | return COFF::IMAGE_REL_ARM64_ADDR32NB; |
63 | 67 | case MCSymbolRefExpr::VK_SECREL: |
64 | 0 | return COFF::IMAGE_REL_ARM64_SECREL; |
65 | 0 | } |
66 | 0 | |
67 | 5 | case FK_Data_8: |
68 | 5 | return COFF::IMAGE_REL_ARM64_ADDR64; |
69 | 0 |
|
70 | 16 | case FK_SecRel_2: |
71 | 16 | return COFF::IMAGE_REL_ARM64_SECTION; |
72 | 0 |
|
73 | 16 | case FK_SecRel_4: |
74 | 16 | return COFF::IMAGE_REL_ARM64_SECREL; |
75 | 0 |
|
76 | 7 | case AArch64::fixup_aarch64_add_imm12: |
77 | 7 | if (const AArch64MCExpr *A64E = dyn_cast<AArch64MCExpr>(Expr)) { |
78 | 6 | AArch64MCExpr::VariantKind RefKind = A64E->getKind(); |
79 | 6 | if (RefKind == AArch64MCExpr::VK_SECREL_LO12) |
80 | 1 | return COFF::IMAGE_REL_ARM64_SECREL_LOW12A; |
81 | 5 | if (RefKind == AArch64MCExpr::VK_SECREL_HI12) |
82 | 1 | return COFF::IMAGE_REL_ARM64_SECREL_HIGH12A; |
83 | 5 | } |
84 | 5 | return COFF::IMAGE_REL_ARM64_PAGEOFFSET_12A; |
85 | 5 | |
86 | 9 | case AArch64::fixup_aarch64_ldst_imm12_scale1: |
87 | 9 | case AArch64::fixup_aarch64_ldst_imm12_scale2: |
88 | 9 | case AArch64::fixup_aarch64_ldst_imm12_scale4: |
89 | 9 | case AArch64::fixup_aarch64_ldst_imm12_scale8: |
90 | 9 | case AArch64::fixup_aarch64_ldst_imm12_scale16: |
91 | 9 | if (const AArch64MCExpr *A64E = dyn_cast<AArch64MCExpr>(Expr)) { |
92 | 9 | AArch64MCExpr::VariantKind RefKind = A64E->getKind(); |
93 | 9 | if (RefKind == AArch64MCExpr::VK_SECREL_LO12) |
94 | 1 | return COFF::IMAGE_REL_ARM64_SECREL_LOW12L; |
95 | 8 | } |
96 | 8 | return COFF::IMAGE_REL_ARM64_PAGEOFFSET_12L; |
97 | 8 | |
98 | 8 | case AArch64::fixup_aarch64_pcrel_adr_imm21: |
99 | 1 | return COFF::IMAGE_REL_ARM64_REL21; |
100 | 8 | |
101 | 10 | case AArch64::fixup_aarch64_pcrel_adrp_imm21: |
102 | 10 | return COFF::IMAGE_REL_ARM64_PAGEBASE_REL21; |
103 | 8 | |
104 | 8 | case AArch64::fixup_aarch64_pcrel_branch14: |
105 | 2 | return COFF::IMAGE_REL_ARM64_BRANCH14; |
106 | 8 | |
107 | 8 | case AArch64::fixup_aarch64_pcrel_branch19: |
108 | 1 | return COFF::IMAGE_REL_ARM64_BRANCH19; |
109 | 8 | |
110 | 26 | case AArch64::fixup_aarch64_pcrel_branch26: |
111 | 26 | case AArch64::fixup_aarch64_pcrel_call26: |
112 | 26 | return COFF::IMAGE_REL_ARM64_BRANCH26; |
113 | 160 | } |
114 | 160 | } |
115 | | |
116 | 160 | bool AArch64WinCOFFObjectWriter::recordRelocation(const MCFixup &Fixup) const { |
117 | 160 | return true; |
118 | 160 | } |
119 | | |
120 | | namespace llvm { |
121 | | |
122 | 91 | std::unique_ptr<MCObjectTargetWriter> createAArch64WinCOFFObjectWriter() { |
123 | 91 | return llvm::make_unique<AArch64WinCOFFObjectWriter>(); |
124 | 91 | } |
125 | | |
126 | | } // end namespace llvm |