aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/libs/llvm12/lib/Target/ARM/MCTargetDesc/ARMWinCOFFObjectWriter.cpp
blob: 9629408f8877ec74f42745bbced65744d6f89835 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
//===-- ARMWinCOFFObjectWriter.cpp - ARM Windows COFF Object Writer -- C++ -==// 
// 
// 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 
// 
//===----------------------------------------------------------------------===// 
 
#include "MCTargetDesc/ARMFixupKinds.h" 
#include "llvm/ADT/Twine.h" 
#include "llvm/BinaryFormat/COFF.h" 
#include "llvm/MC/MCAsmBackend.h" 
#include "llvm/MC/MCExpr.h" 
#include "llvm/MC/MCFixup.h" 
#include "llvm/MC/MCFixupKindInfo.h" 
#include "llvm/MC/MCObjectWriter.h" 
#include "llvm/MC/MCValue.h" 
#include "llvm/MC/MCWinCOFFObjectWriter.h" 
#include "llvm/Support/ErrorHandling.h" 
#include "llvm/Support/raw_ostream.h" 
#include <cassert> 
 
using namespace llvm; 
 
namespace { 
 
class ARMWinCOFFObjectWriter : public MCWinCOFFObjectTargetWriter { 
public: 
  ARMWinCOFFObjectWriter(bool Is64Bit) 
    : MCWinCOFFObjectTargetWriter(COFF::IMAGE_FILE_MACHINE_ARMNT) { 
    assert(!Is64Bit && "AArch64 support not yet implemented"); 
  } 
 
  ~ARMWinCOFFObjectWriter() override = default; 
 
  unsigned getRelocType(MCContext &Ctx, const MCValue &Target, 
                        const MCFixup &Fixup, bool IsCrossSection, 
                        const MCAsmBackend &MAB) const override; 
 
  bool recordRelocation(const MCFixup &) const override; 
}; 
 
} // end anonymous namespace 
 
unsigned ARMWinCOFFObjectWriter::getRelocType(MCContext &Ctx, 
                                              const MCValue &Target, 
                                              const MCFixup &Fixup, 
                                              bool IsCrossSection, 
                                              const MCAsmBackend &MAB) const { 
  assert(getMachine() == COFF::IMAGE_FILE_MACHINE_ARMNT && 
         "AArch64 support not yet implemented"); 
 
  MCSymbolRefExpr::VariantKind Modifier = 
    Target.isAbsolute() ? MCSymbolRefExpr::VK_None : Target.getSymA()->getKind(); 
 
  switch (static_cast<unsigned>(Fixup.getKind())) { 
  default: { 
    const MCFixupKindInfo &Info = MAB.getFixupKindInfo(Fixup.getKind()); 
    report_fatal_error(Twine("unsupported relocation type: ") + Info.Name); 
  } 
  case FK_Data_4: 
    switch (Modifier) { 
    case MCSymbolRefExpr::VK_COFF_IMGREL32: 
      return COFF::IMAGE_REL_ARM_ADDR32NB; 
    case MCSymbolRefExpr::VK_SECREL: 
      return COFF::IMAGE_REL_ARM_SECREL; 
    default: 
      return COFF::IMAGE_REL_ARM_ADDR32; 
    } 
  case FK_SecRel_2: 
    return COFF::IMAGE_REL_ARM_SECTION; 
  case FK_SecRel_4: 
    return COFF::IMAGE_REL_ARM_SECREL; 
  case ARM::fixup_t2_condbranch: 
    return COFF::IMAGE_REL_ARM_BRANCH20T; 
  case ARM::fixup_t2_uncondbranch: 
  case ARM::fixup_arm_thumb_bl: 
    return COFF::IMAGE_REL_ARM_BRANCH24T; 
  case ARM::fixup_arm_thumb_blx: 
    return COFF::IMAGE_REL_ARM_BLX23T; 
  case ARM::fixup_t2_movw_lo16: 
  case ARM::fixup_t2_movt_hi16: 
    return COFF::IMAGE_REL_ARM_MOV32T; 
  } 
} 
 
bool ARMWinCOFFObjectWriter::recordRelocation(const MCFixup &Fixup) const { 
  return static_cast<unsigned>(Fixup.getKind()) != ARM::fixup_t2_movt_hi16; 
} 
 
namespace llvm { 
 
std::unique_ptr<MCObjectTargetWriter> 
createARMWinCOFFObjectWriter(bool Is64Bit) { 
  return std::make_unique<ARMWinCOFFObjectWriter>(Is64Bit); 
} 
 
} // end namespace llvm