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