Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/contrib/llvm-project/llvm/lib/Target/Lanai/MCTargetDesc/LanaiELFObjectWriter.cpp
35295 views
1
//===-- LanaiELFObjectWriter.cpp - Lanai ELF 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/LanaiBaseInfo.h"
10
#include "MCTargetDesc/LanaiFixupKinds.h"
11
#include "llvm/BinaryFormat/ELF.h"
12
#include "llvm/MC/MCELFObjectWriter.h"
13
#include "llvm/MC/MCObjectWriter.h"
14
#include "llvm/Support/ErrorHandling.h"
15
16
using namespace llvm;
17
18
namespace {
19
20
class LanaiELFObjectWriter : public MCELFObjectTargetWriter {
21
public:
22
explicit LanaiELFObjectWriter(uint8_t OSABI);
23
24
~LanaiELFObjectWriter() override = default;
25
26
protected:
27
unsigned getRelocType(MCContext &Ctx, const MCValue &Target,
28
const MCFixup &Fixup, bool IsPCRel) const override;
29
bool needsRelocateWithSymbol(const MCValue &Val, const MCSymbol &Sym,
30
unsigned Type) const override;
31
};
32
33
} // end anonymous namespace
34
35
LanaiELFObjectWriter::LanaiELFObjectWriter(uint8_t OSABI)
36
: MCELFObjectTargetWriter(/*Is64Bit_=*/false, OSABI, ELF::EM_LANAI,
37
/*HasRelocationAddend_=*/true) {}
38
39
unsigned LanaiELFObjectWriter::getRelocType(MCContext & /*Ctx*/,
40
const MCValue & /*Target*/,
41
const MCFixup &Fixup,
42
bool /*IsPCRel*/) const {
43
unsigned Type;
44
unsigned Kind = static_cast<unsigned>(Fixup.getKind());
45
switch (Kind) {
46
case Lanai::FIXUP_LANAI_21:
47
Type = ELF::R_LANAI_21;
48
break;
49
case Lanai::FIXUP_LANAI_21_F:
50
Type = ELF::R_LANAI_21_F;
51
break;
52
case Lanai::FIXUP_LANAI_25:
53
Type = ELF::R_LANAI_25;
54
break;
55
case Lanai::FIXUP_LANAI_32:
56
case FK_Data_4:
57
Type = ELF::R_LANAI_32;
58
break;
59
case Lanai::FIXUP_LANAI_HI16:
60
Type = ELF::R_LANAI_HI16;
61
break;
62
case Lanai::FIXUP_LANAI_LO16:
63
Type = ELF::R_LANAI_LO16;
64
break;
65
case Lanai::FIXUP_LANAI_NONE:
66
Type = ELF::R_LANAI_NONE;
67
break;
68
69
default:
70
llvm_unreachable("Invalid fixup kind!");
71
}
72
return Type;
73
}
74
75
bool LanaiELFObjectWriter::needsRelocateWithSymbol(const MCValue &,
76
const MCSymbol &,
77
unsigned Type) const {
78
switch (Type) {
79
case ELF::R_LANAI_21:
80
case ELF::R_LANAI_21_F:
81
case ELF::R_LANAI_25:
82
case ELF::R_LANAI_32:
83
case ELF::R_LANAI_HI16:
84
return true;
85
default:
86
return false;
87
}
88
}
89
90
std::unique_ptr<MCObjectTargetWriter>
91
llvm::createLanaiELFObjectWriter(uint8_t OSABI) {
92
return std::make_unique<LanaiELFObjectWriter>(OSABI);
93
}
94
95