blob: d0fe4df5d8e889a364f3962e56a97a6b44e57889 [file] [log] [blame]
Eugene Zelenkoe894b4d2017-02-03 23:38:40 +00001//===- AMDGPUELFObjectWriter.cpp - AMDGPU ELF Writer ----------------------===//
Tom Stellard99916592013-04-15 17:51:21 +00002//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// 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
Tom Stellard99916592013-04-15 17:51:21 +00006//
Tom Stellard99916592013-04-15 17:51:21 +00007//===----------------------------------------------------------------------===//
8
9#include "AMDGPUMCTargetDesc.h"
Zachary Turner264b5d92017-06-07 03:48:56 +000010#include "llvm/BinaryFormat/ELF.h"
Tom Stellard99916592013-04-15 17:51:21 +000011#include "llvm/MC/MCELFObjectWriter.h"
Eugene Zelenkoe894b4d2017-02-03 23:38:40 +000012#include "llvm/MC/MCExpr.h"
Tom Stellard067c8152014-07-21 14:01:14 +000013#include "llvm/MC/MCFixup.h"
Lang Hames60fbc7c2017-10-10 16:28:07 +000014#include "llvm/MC/MCObjectWriter.h"
Eugene Zelenkoe894b4d2017-02-03 23:38:40 +000015#include "llvm/MC/MCSymbol.h"
16#include "llvm/MC/MCValue.h"
Eugene Zelenkoe894b4d2017-02-03 23:38:40 +000017#include "llvm/Support/ErrorHandling.h"
Tom Stellard99916592013-04-15 17:51:21 +000018
19using namespace llvm;
20
21namespace {
22
23class AMDGPUELFObjectWriter : public MCELFObjectTargetWriter {
24public:
Konstantin Zhuravlyov8684f7b2017-10-04 22:44:13 +000025 AMDGPUELFObjectWriter(bool Is64Bit, uint8_t OSABI, bool HasRelocationAddend);
Eugene Zelenkoe894b4d2017-02-03 23:38:40 +000026
Tom Stellard99916592013-04-15 17:51:21 +000027protected:
Rafael Espindola8340f942016-01-13 22:56:57 +000028 unsigned getRelocType(MCContext &Ctx, const MCValue &Target,
Tom Stellard1c89eb72016-06-20 16:59:44 +000029 const MCFixup &Fixup, bool IsPCRel) const override;
Tom Stellard99916592013-04-15 17:51:21 +000030};
31
32
Eugene Zelenkoe894b4d2017-02-03 23:38:40 +000033} // end anonymous namespace
Tom Stellard99916592013-04-15 17:51:21 +000034
Tom Stellardbf3e6e52016-06-14 20:29:59 +000035AMDGPUELFObjectWriter::AMDGPUELFObjectWriter(bool Is64Bit,
Konstantin Zhuravlyov8684f7b2017-10-04 22:44:13 +000036 uint8_t OSABI,
Tom Stellardbf3e6e52016-06-14 20:29:59 +000037 bool HasRelocationAddend)
Konstantin Zhuravlyov8684f7b2017-10-04 22:44:13 +000038 : MCELFObjectTargetWriter(Is64Bit, OSABI, ELF::EM_AMDGPU,
Eugene Zelenkoe894b4d2017-02-03 23:38:40 +000039 HasRelocationAddend) {}
Tom Stellard99916592013-04-15 17:51:21 +000040
Tom Stellard1c89eb72016-06-20 16:59:44 +000041unsigned AMDGPUELFObjectWriter::getRelocType(MCContext &Ctx,
42 const MCValue &Target,
43 const MCFixup &Fixup,
44 bool IsPCRel) const {
Matt Arsenault6bc43d82016-10-06 16:20:41 +000045 if (const auto *SymA = Target.getSymA()) {
46 // SCRATCH_RSRC_DWORD[01] is a special global variable that represents
47 // the scratch buffer.
Nicolai Haehnle8d5e9742018-12-19 11:55:03 +000048 if (SymA->getSymbol().getName() == "SCRATCH_RSRC_DWORD0" ||
49 SymA->getSymbol().getName() == "SCRATCH_RSRC_DWORD1")
Matt Arsenault6bc43d82016-10-06 16:20:41 +000050 return ELF::R_AMDGPU_ABS32_LO;
Matt Arsenault6bc43d82016-10-06 16:20:41 +000051 }
Tom Stellard1c89eb72016-06-20 16:59:44 +000052
Tom Stellard14416ae2016-06-23 23:11:29 +000053 switch (Target.getAccessVariant()) {
54 default:
55 break;
56 case MCSymbolRefExpr::VK_GOTPCREL:
57 return ELF::R_AMDGPU_GOTPCREL;
Konstantin Zhuravlyov2a2ac372016-10-14 04:21:32 +000058 case MCSymbolRefExpr::VK_AMDGPU_GOTPCREL32_LO:
59 return ELF::R_AMDGPU_GOTPCREL32_LO;
60 case MCSymbolRefExpr::VK_AMDGPU_GOTPCREL32_HI:
61 return ELF::R_AMDGPU_GOTPCREL32_HI;
62 case MCSymbolRefExpr::VK_AMDGPU_REL32_LO:
63 return ELF::R_AMDGPU_REL32_LO;
64 case MCSymbolRefExpr::VK_AMDGPU_REL32_HI:
65 return ELF::R_AMDGPU_REL32_HI;
Konstantin Zhuravlyov3e5d66a2018-06-11 21:37:57 +000066 case MCSymbolRefExpr::VK_AMDGPU_REL64:
67 return ELF::R_AMDGPU_REL64;
Tom Stellard14416ae2016-06-23 23:11:29 +000068 }
69
Tom Stellard53508942016-06-20 17:33:43 +000070 switch (Fixup.getKind()) {
71 default: break;
72 case FK_PCRel_4:
73 return ELF::R_AMDGPU_REL32;
Konstantin Zhuravlyov15562622016-07-21 15:29:19 +000074 case FK_Data_4:
Jan Vesely3bc1af22016-06-25 18:24:16 +000075 case FK_SecRel_4:
76 return ELF::R_AMDGPU_ABS32;
Tom Stellard6982bb82016-10-07 20:36:58 +000077 case FK_Data_8:
78 return ELF::R_AMDGPU_ABS64;
Tom Stellard53508942016-06-20 17:33:43 +000079 }
80
Tom Stellard1c89eb72016-06-20 16:59:44 +000081 llvm_unreachable("unhandled relocation type");
82}
83
Peter Collingbournedcd7d6c2018-05-21 19:20:29 +000084std::unique_ptr<MCObjectTargetWriter>
Lang Hames60fbc7c2017-10-10 16:28:07 +000085llvm::createAMDGPUELFObjectWriter(bool Is64Bit, uint8_t OSABI,
Peter Collingbournedcd7d6c2018-05-21 19:20:29 +000086 bool HasRelocationAddend) {
87 return llvm::make_unique<AMDGPUELFObjectWriter>(Is64Bit, OSABI,
88 HasRelocationAddend);
Tom Stellard99916592013-04-15 17:51:21 +000089}