]>
Commit | Line | Data |
---|---|---|
223e47cc LB |
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 | ||
970d7e83 LB |
15 | #ifndef LLVM_CODEGEN_MACHORELOCATION_H |
16 | #define LLVM_CODEGEN_MACHORELOCATION_H | |
223e47cc LB |
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 | |
30 | bool r_extern; // | |
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. | |
35 | public: | |
36 | uint32_t getPackedFields() const { | |
37 | if (r_scattered) | |
38 | return (1 << 31) | (r_pcrel << 30) | ((r_length & 3) << 28) | | |
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, | |
48 | bool ext, uint8_t type, bool scattered = false, | |
49 | int32_t value = 0) : | |
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 | ||
970d7e83 | 56 | #endif // LLVM_CODEGEN_MACHORELOCATION_H |