blob: e443b0729606a6f525edffab12a7dac55a92a824 [file] [log] [blame]
Eugene Zelenkoe894b4d2017-02-03 23:38:40 +00001//===- AMDGPUELFObjectWriter.cpp - AMDGPU ELF Writer ----------------------===//
Tom Stellard99916592013-04-15 17:51:21 +00002//
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//
Tom Stellard99916592013-04-15 17:51:21 +00008//===----------------------------------------------------------------------===//
9
10#include "AMDGPUMCTargetDesc.h"
Zachary Turner264b5d92017-06-07 03:48:56 +000011#include "llvm/BinaryFormat/ELF.h"
Tom Stellard99916592013-04-15 17:51:21 +000012#include "llvm/MC/MCELFObjectWriter.h"
Eugene Zelenkoe894b4d2017-02-03 23:38:40 +000013#include "llvm/MC/MCExpr.h"
Tom Stellard067c8152014-07-21 14:01:14 +000014#include "llvm/MC/MCFixup.h"
Lang Hames60fbc7c2017-10-10 16:28:07 +000015#include "llvm/MC/MCObjectWriter.h"
Eugene Zelenkoe894b4d2017-02-03 23:38:40 +000016#include "llvm/MC/MCSymbol.h"
17#include "llvm/MC/MCValue.h"
Eugene Zelenkoe894b4d2017-02-03 23:38:40 +000018#include "llvm/Support/ErrorHandling.h"
Tom Stellard99916592013-04-15 17:51:21 +000019
20using namespace llvm;
21
22namespace {
23
24class AMDGPUELFObjectWriter : public MCELFObjectTargetWriter {
25public:
Konstantin Zhuravlyov8684f7b2017-10-04 22:44:13 +000026 AMDGPUELFObjectWriter(bool Is64Bit, uint8_t OSABI, bool HasRelocationAddend);
Eugene Zelenkoe894b4d2017-02-03 23:38:40 +000027
Tom Stellard99916592013-04-15 17:51:21 +000028protected:
Rafael Espindola8340f942016-01-13 22:56:57 +000029 unsigned getRelocType(MCContext &Ctx, const MCValue &Target,
Tom Stellard1c89eb72016-06-20 16:59:44 +000030 const MCFixup &Fixup, bool IsPCRel) const override;
Tom Stellard99916592013-04-15 17:51:21 +000031};
32
33
Eugene Zelenkoe894b4d2017-02-03 23:38:40 +000034} // end anonymous namespace
Tom Stellard99916592013-04-15 17:51:21 +000035
Tom Stellardbf3e6e52016-06-14 20:29:59 +000036AMDGPUELFObjectWriter::AMDGPUELFObjectWriter(bool Is64Bit,
Konstantin Zhuravlyov8684f7b2017-10-04 22:44:13 +000037 uint8_t OSABI,
Tom Stellardbf3e6e52016-06-14 20:29:59 +000038 bool HasRelocationAddend)
Konstantin Zhuravlyov8684f7b2017-10-04 22:44:13 +000039 : MCELFObjectTargetWriter(Is64Bit, OSABI, ELF::EM_AMDGPU,
Eugene Zelenkoe894b4d2017-02-03 23:38:40 +000040 HasRelocationAddend) {}
Tom Stellard99916592013-04-15 17:51:21 +000041
Tom Stellard1c89eb72016-06-20 16:59:44 +000042unsigned AMDGPUELFObjectWriter::getRelocType(MCContext &Ctx,
43 const MCValue &Target,
44 const MCFixup &Fixup,
45 bool IsPCRel) const {
Matt Arsenault6bc43d82016-10-06 16:20:41 +000046 if (const auto *SymA = Target.getSymA()) {
47 // SCRATCH_RSRC_DWORD[01] is a special global variable that represents
48 // the scratch buffer.
49 if (SymA->getSymbol().getName() == "SCRATCH_RSRC_DWORD0")
50 return ELF::R_AMDGPU_ABS32_LO;
51
52 if (SymA->getSymbol().getName() == "SCRATCH_RSRC_DWORD1")
53 return ELF::R_AMDGPU_ABS32_HI;
54 }
Tom Stellard1c89eb72016-06-20 16:59:44 +000055
Tom Stellard14416ae2016-06-23 23:11:29 +000056 switch (Target.getAccessVariant()) {
57 default:
58 break;
59 case MCSymbolRefExpr::VK_GOTPCREL:
60 return ELF::R_AMDGPU_GOTPCREL;
Konstantin Zhuravlyov2a2ac372016-10-14 04:21:32 +000061 case MCSymbolRefExpr::VK_AMDGPU_GOTPCREL32_LO:
62 return ELF::R_AMDGPU_GOTPCREL32_LO;
63 case MCSymbolRefExpr::VK_AMDGPU_GOTPCREL32_HI:
64 return ELF::R_AMDGPU_GOTPCREL32_HI;
65 case MCSymbolRefExpr::VK_AMDGPU_REL32_LO:
66 return ELF::R_AMDGPU_REL32_LO;
67 case MCSymbolRefExpr::VK_AMDGPU_REL32_HI:
68 return ELF::R_AMDGPU_REL32_HI;
Tom Stellard14416ae2016-06-23 23:11:29 +000069 }
70
Tom Stellard53508942016-06-20 17:33:43 +000071 switch (Fixup.getKind()) {
72 default: break;
73 case FK_PCRel_4:
74 return ELF::R_AMDGPU_REL32;
Konstantin Zhuravlyov15562622016-07-21 15:29:19 +000075 case FK_Data_4:
Jan Vesely3bc1af22016-06-25 18:24:16 +000076 case FK_SecRel_4:
77 return ELF::R_AMDGPU_ABS32;
Tom Stellard6982bb82016-10-07 20:36:58 +000078 case FK_Data_8:
79 return ELF::R_AMDGPU_ABS64;
Tom Stellard53508942016-06-20 17:33:43 +000080 }
81
Tom Stellard1c89eb72016-06-20 16:59:44 +000082 llvm_unreachable("unhandled relocation type");
83}
84
Lang Hames60fbc7c2017-10-10 16:28:07 +000085std::unique_ptr<MCObjectWriter>
86llvm::createAMDGPUELFObjectWriter(bool Is64Bit, uint8_t OSABI,
87 bool HasRelocationAddend,
88 raw_pwrite_stream &OS) {
Lang Hamesdcb312b2017-10-09 23:53:15 +000089 auto MOTW = llvm::make_unique<AMDGPUELFObjectWriter>(Is64Bit, OSABI,
90 HasRelocationAddend);
91 return createELFObjectWriter(std::move(MOTW), OS, true);
Tom Stellard99916592013-04-15 17:51:21 +000092}