annotate lib/Target/Lanai/MCTargetDesc/LanaiELFObjectWriter.cpp @ 120:1172e4bd9c6f

update 4.0.0
author mir3636
date Fri, 25 Nov 2016 19:14:25 +0900
parents
children 803732b1fca8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
120
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
1 //===-- LanaiELFObjectWriter.cpp - Lanai ELF Writer -----------------------===//
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
2 //
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
3 // The LLVM Compiler Infrastructure
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
4 //
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
5 // This file is distributed under the University of Illinois Open Source
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
6 // License. See LICENSE.TXT for details.
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
7 //
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
8 //===----------------------------------------------------------------------===//
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
9
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
10 #include "MCTargetDesc/LanaiBaseInfo.h"
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
11 #include "MCTargetDesc/LanaiFixupKinds.h"
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
12 #include "MCTargetDesc/LanaiMCTargetDesc.h"
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
13 #include "llvm/MC/MCELFObjectWriter.h"
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
14 #include "llvm/MC/MCSymbol.h"
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
15 #include "llvm/Support/ErrorHandling.h"
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
16 #include "llvm/Support/raw_ostream.h"
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
17
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
18 using namespace llvm;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
19
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
20 namespace {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
21 class LanaiELFObjectWriter : public MCELFObjectTargetWriter {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
22 public:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
23 explicit LanaiELFObjectWriter(uint8_t OSABI);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
24
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
25 ~LanaiELFObjectWriter() override;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
26
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
27 protected:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
28 unsigned getRelocType(MCContext &Ctx, const MCValue &Target,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
29 const MCFixup &Fixup, bool IsPCRel) const override;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
30 bool needsRelocateWithSymbol(const MCSymbol &SD,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
31 unsigned Type) const override;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
32 };
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
33 } // namespace
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
34
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
35 LanaiELFObjectWriter::LanaiELFObjectWriter(uint8_t OSABI)
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
36 : MCELFObjectTargetWriter(/*Is64Bit_=*/false, OSABI, ELF::EM_LANAI,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
37 /*HasRelocationAddend=*/true) {}
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
38
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
39 LanaiELFObjectWriter::~LanaiELFObjectWriter() {}
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
40
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
41 unsigned LanaiELFObjectWriter::getRelocType(MCContext & /*Ctx*/,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
42 const MCValue & /*Target*/,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
43 const MCFixup &Fixup,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
44 bool /*IsPCRel*/) const {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
45 unsigned Type;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
46 unsigned Kind = static_cast<unsigned>(Fixup.getKind());
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
47 switch (Kind) {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
48 case Lanai::FIXUP_LANAI_21:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
49 Type = ELF::R_LANAI_21;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
50 break;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
51 case Lanai::FIXUP_LANAI_21_F:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
52 Type = ELF::R_LANAI_21_F;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
53 break;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
54 case Lanai::FIXUP_LANAI_25:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
55 Type = ELF::R_LANAI_25;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
56 break;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
57 case Lanai::FIXUP_LANAI_32:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
58 case FK_Data_4:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
59 Type = ELF::R_LANAI_32;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
60 break;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
61 case Lanai::FIXUP_LANAI_HI16:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
62 Type = ELF::R_LANAI_HI16;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
63 break;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
64 case Lanai::FIXUP_LANAI_LO16:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
65 Type = ELF::R_LANAI_LO16;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
66 break;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
67 case Lanai::FIXUP_LANAI_NONE:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
68 Type = ELF::R_LANAI_NONE;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
69 break;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
70
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
71 default:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
72 llvm_unreachable("Invalid fixup kind!");
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
73 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
74 return Type;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
75 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
76
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
77 bool LanaiELFObjectWriter::needsRelocateWithSymbol(const MCSymbol & /*SD*/,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
78 unsigned Type) const {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
79 switch (Type) {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
80 case ELF::R_LANAI_21:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
81 case ELF::R_LANAI_21_F:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
82 case ELF::R_LANAI_25:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
83 case ELF::R_LANAI_32:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
84 case ELF::R_LANAI_HI16:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
85 return true;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
86 default:
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
87 return false;
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
88 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
89 }
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
90
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
91 MCObjectWriter *llvm::createLanaiELFObjectWriter(raw_pwrite_stream &OS,
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
92 uint8_t OSABI) {
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
93 MCELFObjectTargetWriter *MOTW = new LanaiELFObjectWriter(OSABI);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
94 return createELFObjectWriter(MOTW, OS, /*IsLittleEndian=*/false);
1172e4bd9c6f update 4.0.0
mir3636
parents:
diff changeset
95 }