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