Andrew Scull | 5e1ddfa | 2018-08-14 10:06:54 +0100 | [diff] [blame] | 1 | //=== MachORelocation.h - Mach-O Relocation Info ----------------*- C++ -*-===// |
| 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 | // This file defines the MachORelocation class. |
| 11 | // |
| 12 | //===----------------------------------------------------------------------===// |
| 13 | |
| 14 | |
| 15 | #ifndef LLVM_CODEGEN_MACHORELOCATION_H |
| 16 | #define LLVM_CODEGEN_MACHORELOCATION_H |
| 17 | |
| 18 | #include "llvm/Support/DataTypes.h" |
| 19 | |
| 20 | namespace llvm { |
| 21 | |
| 22 | /// MachORelocation - This struct contains information about each relocation |
| 23 | /// that needs to be emitted to the file. |
| 24 | /// see <mach-o/reloc.h> |
| 25 | class MachORelocation { |
| 26 | uint32_t r_address; // offset in the section to what is being relocated |
| 27 | uint32_t r_symbolnum; // symbol index if r_extern == 1 else section index |
| 28 | bool r_pcrel; // was relocated pc-relative already |
| 29 | uint8_t r_length; // length = 2 ^ r_length |
Andrew Scull | cdfcccc | 2018-10-05 20:58:37 +0100 | [diff] [blame^] | 30 | bool r_extern; // |
Andrew Scull | 5e1ddfa | 2018-08-14 10:06:54 +0100 | [diff] [blame] | 31 | uint8_t r_type; // if not 0, machine-specific relocation type. |
| 32 | bool r_scattered; // 1 = scattered, 0 = non-scattered |
| 33 | int32_t r_value; // the value the item to be relocated is referring |
| 34 | // to. |
Andrew Scull | cdfcccc | 2018-10-05 20:58:37 +0100 | [diff] [blame^] | 35 | public: |
Andrew Scull | 5e1ddfa | 2018-08-14 10:06:54 +0100 | [diff] [blame] | 36 | uint32_t getPackedFields() const { |
| 37 | if (r_scattered) |
Andrew Scull | cdfcccc | 2018-10-05 20:58:37 +0100 | [diff] [blame^] | 38 | return (1 << 31) | (r_pcrel << 30) | ((r_length & 3) << 28) | |
Andrew Scull | 5e1ddfa | 2018-08-14 10:06:54 +0100 | [diff] [blame] | 39 | ((r_type & 15) << 24) | (r_address & 0x00FFFFFF); |
| 40 | else |
| 41 | return (r_symbolnum << 8) | (r_pcrel << 7) | ((r_length & 3) << 5) | |
| 42 | (r_extern << 4) | (r_type & 15); |
| 43 | } |
| 44 | uint32_t getAddress() const { return r_scattered ? r_value : r_address; } |
| 45 | uint32_t getRawAddress() const { return r_address; } |
| 46 | |
| 47 | MachORelocation(uint32_t addr, uint32_t index, bool pcrel, uint8_t len, |
Andrew Scull | cdfcccc | 2018-10-05 20:58:37 +0100 | [diff] [blame^] | 48 | bool ext, uint8_t type, bool scattered = false, |
| 49 | int32_t value = 0) : |
Andrew Scull | 5e1ddfa | 2018-08-14 10:06:54 +0100 | [diff] [blame] | 50 | r_address(addr), r_symbolnum(index), r_pcrel(pcrel), r_length(len), |
| 51 | r_extern(ext), r_type(type), r_scattered(scattered), r_value(value) {} |
| 52 | }; |
| 53 | |
| 54 | } // end llvm namespace |
| 55 | |
| 56 | #endif // LLVM_CODEGEN_MACHORELOCATION_H |