1806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher//===-- RelocVisitor.h - Visitor for object file relocations -*- C++ -*-===// 2806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher// 3806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher// The LLVM Compiler Infrastructure 4806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher// 5806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher// This file is distributed under the University of Illinois Open Source 6806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher// License. See LICENSE.TXT for details. 7806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher// 8806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher//===----------------------------------------------------------------------===// 9806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher// 10806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher// This file provides a wrapper around all the different types of relocations 11806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher// in different file formats, such that a client can handle them in a unified 12806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher// manner by only implementing a minimal number of functions. 13806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher// 14806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher//===----------------------------------------------------------------------===// 15806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher 16674be02d525d4e24bc6943ed9274958c580bcfbcJakub Staszak#ifndef LLVM_OBJECT_RELOCVISITOR_H 17674be02d525d4e24bc6943ed9274958c580bcfbcJakub Staszak#define LLVM_OBJECT_RELOCVISITOR_H 18806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher 1937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines#include "llvm/Object/COFF.h" 20081a1941b595f6294e4ce678fd61ef56a2ceb51eMichael J. Spencer#include "llvm/Object/ELFObjectFile.h" 216948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar#include "llvm/Object/MachO.h" 2236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#include "llvm/Object/ObjectFile.h" 23806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher#include "llvm/Support/Debug.h" 24e37dd04b10226dd5683e6f75acc1852502604cc3Jakub Staszak#include "llvm/Support/ELF.h" 256948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar#include "llvm/Support/MachO.h" 26806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher#include "llvm/Support/raw_ostream.h" 27806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher 28806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christophernamespace llvm { 29806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christophernamespace object { 30806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher 31806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopherstruct RelocToApply { 32806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher // The computed value after applying the relevant relocations. 33806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher int64_t Value; 34806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher 35806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher // The width of the value; how many bytes to touch when applying the 36806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher // relocation. 37806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher char Width; 38806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher RelocToApply(int64_t Value, char Width) : Value(Value), Width(Width) {} 39806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher RelocToApply() : Value(0), Width(0) {} 40806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher}; 41806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher 42806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher/// @brief Base class for object file relocation visitors. 43806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopherclass RelocVisitor { 44806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopherpublic: 4537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines explicit RelocVisitor(const ObjectFile &Obj) 4637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines : ObjToVisit(Obj), HasError(false) {} 47806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher 48806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher // TODO: Should handle multiple applied relocations via either passing in the 49806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher // previously computed value or just count paired relocations as a single 50806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher // visit. 5137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines RelocToApply visit(uint32_t RelocType, RelocationRef R, uint64_t Value = 0) { 5237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (isa<ELFObjectFileBase>(ObjToVisit)) 5337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return visitELF(RelocType, R, Value); 5437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (isa<COFFObjectFile>(ObjToVisit)) 5537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return visitCOFF(RelocType, R, Value); 566948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar if (isa<MachOObjectFile>(ObjToVisit)) 576948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return visitMachO(RelocType, R, Value); 5837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 5937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines HasError = true; 6037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return RelocToApply(); 6137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 6237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 6337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines bool error() { return HasError; } 6437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 6537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hinesprivate: 6637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines const ObjectFile &ObjToVisit; 6737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines bool HasError; 6837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 6937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines RelocToApply visitELF(uint32_t RelocType, RelocationRef R, uint64_t Value) { 7037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (ObjToVisit.getBytesInAddress() == 8) { // 64-bit object file 7137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines switch (ObjToVisit.getArch()) { 7237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines case Triple::x86_64: 7337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines switch (RelocType) { 74806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher case llvm::ELF::R_X86_64_NONE: 75806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher return visitELF_X86_64_NONE(R); 76806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher case llvm::ELF::R_X86_64_64: 77806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher return visitELF_X86_64_64(R, Value); 78806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher case llvm::ELF::R_X86_64_PC32: 7937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return visitELF_X86_64_PC32(R, Value); 80806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher case llvm::ELF::R_X86_64_32: 81806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher return visitELF_X86_64_32(R, Value); 82806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher case llvm::ELF::R_X86_64_32S: 83806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher return visitELF_X86_64_32S(R, Value); 84806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher default: 85806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher HasError = true; 86806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher return RelocToApply(); 8737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 8837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines case Triple::aarch64: 8937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines switch (RelocType) { 9037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines case llvm::ELF::R_AARCH64_ABS32: 9137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return visitELF_AARCH64_ABS32(R, Value); 9237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines case llvm::ELF::R_AARCH64_ABS64: 9337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return visitELF_AARCH64_ABS64(R, Value); 9437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines default: 9537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines HasError = true; 9637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return RelocToApply(); 9737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 9837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines case Triple::mips64el: 9937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines case Triple::mips64: 10037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines switch (RelocType) { 10137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines case llvm::ELF::R_MIPS_32: 102f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar return visitELF_MIPS64_32(R, Value); 10337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines case llvm::ELF::R_MIPS_64: 104f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar return visitELF_MIPS64_64(R, Value); 10537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines default: 10637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines HasError = true; 10737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return RelocToApply(); 10837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 10937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines case Triple::ppc64le: 11037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines case Triple::ppc64: 11137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines switch (RelocType) { 11237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines case llvm::ELF::R_PPC64_ADDR32: 11337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return visitELF_PPC64_ADDR32(R, Value); 11437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines case llvm::ELF::R_PPC64_ADDR64: 11537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return visitELF_PPC64_ADDR64(R, Value); 11637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines default: 11737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines HasError = true; 11837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return RelocToApply(); 11937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 12037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines case Triple::systemz: 12137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines switch (RelocType) { 12237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines case llvm::ELF::R_390_32: 12337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return visitELF_390_32(R, Value); 12437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines case llvm::ELF::R_390_64: 12537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return visitELF_390_64(R, Value); 12637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines default: 12737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines HasError = true; 12837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return RelocToApply(); 12937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 13037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines case Triple::sparcv9: 13137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines switch (RelocType) { 13237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines case llvm::ELF::R_SPARC_32: 13337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines case llvm::ELF::R_SPARC_UA32: 13437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return visitELF_SPARCV9_32(R, Value); 13537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines case llvm::ELF::R_SPARC_64: 13637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines case llvm::ELF::R_SPARC_UA64: 13737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return visitELF_SPARCV9_64(R, Value); 13837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines default: 13937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines HasError = true; 14037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return RelocToApply(); 14137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 142820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford default: 143820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford HasError = true; 144820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford return RelocToApply(); 145820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford } 14637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } else if (ObjToVisit.getBytesInAddress() == 4) { // 32-bit object file 14737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines switch (ObjToVisit.getArch()) { 14837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines case Triple::x86: 14937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines switch (RelocType) { 15037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines case llvm::ELF::R_386_NONE: 15137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return visitELF_386_NONE(R); 15237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines case llvm::ELF::R_386_32: 15337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return visitELF_386_32(R, Value); 15437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines case llvm::ELF::R_386_PC32: 15537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return visitELF_386_PC32(R, Value); 15637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines default: 15737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines HasError = true; 15837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return RelocToApply(); 15937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 16037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines case Triple::ppc: 16137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines switch (RelocType) { 16237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines case llvm::ELF::R_PPC_ADDR32: 16337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return visitELF_PPC_ADDR32(R, Value); 16437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines default: 16537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines HasError = true; 16637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return RelocToApply(); 16737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 16837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines case Triple::arm: 16937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines case Triple::armeb: 17037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines switch (RelocType) { 17137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines default: 17237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines HasError = true; 17337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return RelocToApply(); 17437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines case llvm::ELF::R_ARM_ABS32: 17537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return visitELF_ARM_ABS32(R, Value); 17637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 177de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar case Triple::lanai: 178de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar switch (RelocType) { 179de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar case llvm::ELF::R_LANAI_32: 180de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return visitELF_Lanai_32(R, Value); 181de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar default: 182de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar HasError = true; 183de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return RelocToApply(); 184de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 18537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines case Triple::mipsel: 18637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines case Triple::mips: 18737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines switch (RelocType) { 18837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines case llvm::ELF::R_MIPS_32: 18937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return visitELF_MIPS_32(R, Value); 19037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines default: 19137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines HasError = true; 19237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return RelocToApply(); 19337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 19437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines case Triple::sparc: 19537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines switch (RelocType) { 19637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines case llvm::ELF::R_SPARC_32: 19737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines case llvm::ELF::R_SPARC_UA32: 19837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return visitELF_SPARC_32(R, Value); 19937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines default: 20037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines HasError = true; 20137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return RelocToApply(); 20237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 20336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines default: 20436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines HasError = true; 20536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return RelocToApply(); 20636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 20737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } else { 20837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines report_fatal_error("Invalid word size in object file"); 20937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 21037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 21137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 21237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines RelocToApply visitCOFF(uint32_t RelocType, RelocationRef R, uint64_t Value) { 21337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines switch (ObjToVisit.getArch()) { 21437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines case Triple::x86: 21536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines switch (RelocType) { 21637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines case COFF::IMAGE_REL_I386_SECREL: 21737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return visitCOFF_I386_SECREL(R, Value); 21837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines case COFF::IMAGE_REL_I386_DIR32: 21937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return visitCOFF_I386_DIR32(R, Value); 22036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 22137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines break; 22237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines case Triple::x86_64: 22336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines switch (RelocType) { 22437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines case COFF::IMAGE_REL_AMD64_SECREL: 22537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return visitCOFF_AMD64_SECREL(R, Value); 22637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines case COFF::IMAGE_REL_AMD64_ADDR64: 22737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return visitCOFF_AMD64_ADDR64(R, Value); 22836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 22937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines break; 230806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher } 2311ae9e8b2783870ebf1c3353611acecef2d951495NAKAMURA Takumi HasError = true; 232806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher return RelocToApply(); 233806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher } 234806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher 2356948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar RelocToApply visitMachO(uint32_t RelocType, RelocationRef R, uint64_t Value) { 2366948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar switch (ObjToVisit.getArch()) { 2376948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar default: break; 2386948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar case Triple::x86_64: 2396948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar switch (RelocType) { 2406948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar default: break; 2416948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar case MachO::X86_64_RELOC_UNSIGNED: 2426948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return visitMACHO_X86_64_UNSIGNED(R, Value); 2436948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 2446948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 2456948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar HasError = true; 2466948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return RelocToApply(); 2476948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 2486948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 249f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar int64_t getELFAddend(RelocationRef R) { 250f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar ErrorOr<int64_t> AddendOrErr = ELFRelocationRef(R).getAddend(); 251f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar if (std::error_code EC = AddendOrErr.getError()) 252f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar report_fatal_error(EC.message()); 253f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar return *AddendOrErr; 2544fcf82f3163f34ddc5c659ceb20e87057a287e10Rafael Espindola } 2556948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 2566948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar uint8_t getLengthMachO64(RelocationRef R) { 257f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar const MachOObjectFile *Obj = cast<MachOObjectFile>(R.getObject()); 2586948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return Obj->getRelocationLength(R.getRawDataRefImpl()); 2596948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 2606948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 261806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher /// Operations 262806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher 26332b3768ec1ae95cb05d1f595d31761c510c43251Eric Christopher /// 386-ELF 26432b3768ec1ae95cb05d1f595d31761c510c43251Eric Christopher RelocToApply visitELF_386_NONE(RelocationRef R) { 26532b3768ec1ae95cb05d1f595d31761c510c43251Eric Christopher return RelocToApply(0, 0); 26632b3768ec1ae95cb05d1f595d31761c510c43251Eric Christopher } 26732b3768ec1ae95cb05d1f595d31761c510c43251Eric Christopher 26832b3768ec1ae95cb05d1f595d31761c510c43251Eric Christopher // Ideally the Addend here will be the addend in the data for 26932b3768ec1ae95cb05d1f595d31761c510c43251Eric Christopher // the relocation. It's not actually the case for Rel relocations. 27032b3768ec1ae95cb05d1f595d31761c510c43251Eric Christopher RelocToApply visitELF_386_32(RelocationRef R, uint64_t Value) { 271f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar return RelocToApply(Value, 4); 27232b3768ec1ae95cb05d1f595d31761c510c43251Eric Christopher } 27332b3768ec1ae95cb05d1f595d31761c510c43251Eric Christopher 27437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines RelocToApply visitELF_386_PC32(RelocationRef R, uint64_t Value) { 275f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar uint64_t Address = R.getOffset(); 276f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar return RelocToApply(Value - Address, 4); 27732b3768ec1ae95cb05d1f595d31761c510c43251Eric Christopher } 27832b3768ec1ae95cb05d1f595d31761c510c43251Eric Christopher 279806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher /// X86-64 ELF 280806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher RelocToApply visitELF_X86_64_NONE(RelocationRef R) { 281806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher return RelocToApply(0, 0); 282806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher } 283806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher RelocToApply visitELF_X86_64_64(RelocationRef R, uint64_t Value) { 284f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar int64_t Addend = getELFAddend(R); 285806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher return RelocToApply(Value + Addend, 8); 286806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher } 28737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines RelocToApply visitELF_X86_64_PC32(RelocationRef R, uint64_t Value) { 288f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar int64_t Addend = getELFAddend(R); 289f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar uint64_t Address = R.getOffset(); 290806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher return RelocToApply(Value + Addend - Address, 4); 291806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher } 292806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher RelocToApply visitELF_X86_64_32(RelocationRef R, uint64_t Value) { 293f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar int64_t Addend = getELFAddend(R); 294806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher uint32_t Res = (Value + Addend) & 0xFFFFFFFF; 295806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher return RelocToApply(Res, 4); 296806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher } 297806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher RelocToApply visitELF_X86_64_32S(RelocationRef R, uint64_t Value) { 298f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar int64_t Addend = getELFAddend(R); 299806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher int32_t Res = (Value + Addend) & 0xFFFFFFFF; 300806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher return RelocToApply(Res, 4); 301806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher } 302994754feea585ba4f088e0aed2e0b59cc77702bdNAKAMURA Takumi 303994754feea585ba4f088e0aed2e0b59cc77702bdNAKAMURA Takumi /// PPC64 ELF 304994754feea585ba4f088e0aed2e0b59cc77702bdNAKAMURA Takumi RelocToApply visitELF_PPC64_ADDR32(RelocationRef R, uint64_t Value) { 305f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar int64_t Addend = getELFAddend(R); 306994754feea585ba4f088e0aed2e0b59cc77702bdNAKAMURA Takumi uint32_t Res = (Value + Addend) & 0xFFFFFFFF; 307994754feea585ba4f088e0aed2e0b59cc77702bdNAKAMURA Takumi return RelocToApply(Res, 4); 308994754feea585ba4f088e0aed2e0b59cc77702bdNAKAMURA Takumi } 3095c368899b30a6b2d2148e8f37e8181ba2b7c2b80Benjamin Kramer RelocToApply visitELF_PPC64_ADDR64(RelocationRef R, uint64_t Value) { 310f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar int64_t Addend = getELFAddend(R); 3115c368899b30a6b2d2148e8f37e8181ba2b7c2b80Benjamin Kramer return RelocToApply(Value + Addend, 8); 3125c368899b30a6b2d2148e8f37e8181ba2b7c2b80Benjamin Kramer } 3133802947dec01dcf95d1b4b6545e88e549744e2b1NAKAMURA Takumi 314769b70ec4f22129317631eab8c87bb5b0e45a4a5Benjamin Kramer /// PPC32 ELF 315769b70ec4f22129317631eab8c87bb5b0e45a4a5Benjamin Kramer RelocToApply visitELF_PPC_ADDR32(RelocationRef R, uint64_t Value) { 316f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar int64_t Addend = getELFAddend(R); 317769b70ec4f22129317631eab8c87bb5b0e45a4a5Benjamin Kramer uint32_t Res = (Value + Addend) & 0xFFFFFFFF; 318769b70ec4f22129317631eab8c87bb5b0e45a4a5Benjamin Kramer return RelocToApply(Res, 4); 319769b70ec4f22129317631eab8c87bb5b0e45a4a5Benjamin Kramer } 320769b70ec4f22129317631eab8c87bb5b0e45a4a5Benjamin Kramer 321de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// Lanai ELF 322de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar RelocToApply visitELF_Lanai_32(RelocationRef R, uint64_t Value) { 323de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar int64_t Addend = getELFAddend(R); 324de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar uint32_t Res = (Value + Addend) & 0xFFFFFFFF; 325de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return RelocToApply(Res, 4); 326de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 327de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 3283802947dec01dcf95d1b4b6545e88e549744e2b1NAKAMURA Takumi /// MIPS ELF 3293802947dec01dcf95d1b4b6545e88e549744e2b1NAKAMURA Takumi RelocToApply visitELF_MIPS_32(RelocationRef R, uint64_t Value) { 330f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar uint32_t Res = Value & 0xFFFFFFFF; 331f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar return RelocToApply(Res, 4); 332f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar } 333f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 334f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar /// MIPS64 ELF 335f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar RelocToApply visitELF_MIPS64_32(RelocationRef R, uint64_t Value) { 336f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar int64_t Addend = getELFAddend(R); 3373802947dec01dcf95d1b4b6545e88e549744e2b1NAKAMURA Takumi uint32_t Res = (Value + Addend) & 0xFFFFFFFF; 3383802947dec01dcf95d1b4b6545e88e549744e2b1NAKAMURA Takumi return RelocToApply(Res, 4); 3393802947dec01dcf95d1b4b6545e88e549744e2b1NAKAMURA Takumi } 340b05dc5546062f29bf08837db8f680879aa1c14cfTim Northover 341f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar RelocToApply visitELF_MIPS64_64(RelocationRef R, uint64_t Value) { 342f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar int64_t Addend = getELFAddend(R); 34336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines uint64_t Res = (Value + Addend); 34436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return RelocToApply(Res, 8); 34536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 34636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 347b05dc5546062f29bf08837db8f680879aa1c14cfTim Northover // AArch64 ELF 348b05dc5546062f29bf08837db8f680879aa1c14cfTim Northover RelocToApply visitELF_AARCH64_ABS32(RelocationRef R, uint64_t Value) { 349f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar int64_t Addend = getELFAddend(R); 350b05dc5546062f29bf08837db8f680879aa1c14cfTim Northover int64_t Res = Value + Addend; 351b05dc5546062f29bf08837db8f680879aa1c14cfTim Northover 352b05dc5546062f29bf08837db8f680879aa1c14cfTim Northover // Overflow check allows for both signed and unsigned interpretation. 353b05dc5546062f29bf08837db8f680879aa1c14cfTim Northover if (Res < INT32_MIN || Res > UINT32_MAX) 354b05dc5546062f29bf08837db8f680879aa1c14cfTim Northover HasError = true; 355b05dc5546062f29bf08837db8f680879aa1c14cfTim Northover 356b05dc5546062f29bf08837db8f680879aa1c14cfTim Northover return RelocToApply(static_cast<uint32_t>(Res), 4); 357b05dc5546062f29bf08837db8f680879aa1c14cfTim Northover } 358b05dc5546062f29bf08837db8f680879aa1c14cfTim Northover 359b05dc5546062f29bf08837db8f680879aa1c14cfTim Northover RelocToApply visitELF_AARCH64_ABS64(RelocationRef R, uint64_t Value) { 360f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar int64_t Addend = getELFAddend(R); 361b05dc5546062f29bf08837db8f680879aa1c14cfTim Northover return RelocToApply(Value + Addend, 8); 362b05dc5546062f29bf08837db8f680879aa1c14cfTim Northover } 363b05dc5546062f29bf08837db8f680879aa1c14cfTim Northover 364820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford // SystemZ ELF 365820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford RelocToApply visitELF_390_32(RelocationRef R, uint64_t Value) { 366f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar int64_t Addend = getELFAddend(R); 367820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford int64_t Res = Value + Addend; 368820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford 369820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford // Overflow check allows for both signed and unsigned interpretation. 370820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford if (Res < INT32_MIN || Res > UINT32_MAX) 371820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford HasError = true; 372820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford 373820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford return RelocToApply(static_cast<uint32_t>(Res), 4); 374820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford } 375820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford 376820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford RelocToApply visitELF_390_64(RelocationRef R, uint64_t Value) { 377f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar int64_t Addend = getELFAddend(R); 378820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford return RelocToApply(Value + Addend, 8); 379820b3fd7716cf5ab26961d1b2b21fd5d0f330fe1Richard Sandiford } 38036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 38136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines RelocToApply visitELF_SPARC_32(RelocationRef R, uint32_t Value) { 382f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar int32_t Addend = getELFAddend(R); 38336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return RelocToApply(Value + Addend, 4); 38436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 38536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 38636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines RelocToApply visitELF_SPARCV9_32(RelocationRef R, uint64_t Value) { 387f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar int32_t Addend = getELFAddend(R); 38836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return RelocToApply(Value + Addend, 4); 38936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 39036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 39136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines RelocToApply visitELF_SPARCV9_64(RelocationRef R, uint64_t Value) { 392f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar int64_t Addend = getELFAddend(R); 39336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return RelocToApply(Value + Addend, 8); 39436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 39536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 39636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines RelocToApply visitELF_ARM_ABS32(RelocationRef R, uint64_t Value) { 397f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar int64_t Res = Value; 39837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 39937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines // Overflow check allows for both signed and unsigned interpretation. 40037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (Res < INT32_MIN || Res > UINT32_MAX) 40137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines HasError = true; 40237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 40337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return RelocToApply(static_cast<uint32_t>(Res), 4); 40436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 40536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 40637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines /// I386 COFF 40737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines RelocToApply visitCOFF_I386_SECREL(RelocationRef R, uint64_t Value) { 40837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return RelocToApply(static_cast<uint32_t>(Value), /*Width=*/4); 40937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 41037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 41137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines RelocToApply visitCOFF_I386_DIR32(RelocationRef R, uint64_t Value) { 41237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return RelocToApply(static_cast<uint32_t>(Value), /*Width=*/4); 41337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 41437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 41537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines /// AMD64 COFF 41637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines RelocToApply visitCOFF_AMD64_SECREL(RelocationRef R, uint64_t Value) { 41737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return RelocToApply(static_cast<uint32_t>(Value), /*Width=*/4); 41837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 41937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 42037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines RelocToApply visitCOFF_AMD64_ADDR64(RelocationRef R, uint64_t Value) { 42137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return RelocToApply(Value, /*Width=*/8); 42237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 4236948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 4246948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar // X86_64 MachO 4256948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar RelocToApply visitMACHO_X86_64_UNSIGNED(RelocationRef R, uint64_t Value) { 4266948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar uint8_t Length = getLengthMachO64(R); 4276948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar Length = 1<<Length; 4286948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar return RelocToApply(Value, Length); 4296948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 430806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher}; 431806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher 432806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher} 433806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher} 434806e03d2381709ddfb5a8012729bbe6eae12caf5Eric Christopher#endif 435