MachineRelocation.h revision b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0
1b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner//===-- llvm/CodeGen/MachineRelocation.h - Target Relocation ----*- C++ -*-===// 2b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner// 3b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner// The LLVM Compiler Infrastructure 4b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner// 5b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner// This file was developed by the LLVM research group and is distributed under 6b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner// the University of Illinois Open Source License. See LICENSE.TXT for details. 7b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner// 8b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner//===----------------------------------------------------------------------===// 9b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner// 10b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner// This file defines the MachineRelocation class. 11b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner// 12b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner//===----------------------------------------------------------------------===// 13b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner 14b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner#ifndef LLVM_CODEGEN_MACHINERELOCATION_H 15b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner#define LLVM_CODEGEN_MACHINERELOCATION_H 16b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner 17b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner#include "llvm/Support/DataTypes.h" 18b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner 19b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattnernamespace llvm { 20b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattnerclass GlobalValue; 21b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner 22b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner/// MachineRelocation - This represents a target-specific relocation value, 23b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner/// produced by the code emitter. This relocation is resolved after the has 24b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner/// been emitted, either to an object file or to memory, when the target of the 25b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner/// relocation can be resolved. 26b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner/// 27b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner/// A relocation is made up of the following logical portions: 28b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner/// 1. An offset in the machine code buffer, the location to modify. 29b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner/// 2. A target specific relocation type (a number from 0 to 127). 30b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner/// 3. A symbol being referenced, either as a GlobalValue* or as a string. 31b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner/// 4. An optional constant value to be added to the reference. 32b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner/// 33b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattnerclass MachineRelocation { 34b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner /// OffsetTypeExternal - The low 24-bits of this value is the offset from the 35b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner /// start of the code buffer of the relocation to perform. Bit 24 of this is 36b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner /// set if Target should use ExtSym instead of GV, and the high 7 bits are to 37b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner /// hold the relocation type. 38b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner unsigned OffsetTypeExternal; 39b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner union { 40b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner GlobalValue *GV; // If this is a pointer to an LLVM global 41b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner const char *ExtSym; // If this is a pointer to a named symbol 42b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner void *Result; // If this has been resolved to a resolved pointer 43b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner } Target; 44b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner intptr_t ConstantVal; 45b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattnerpublic: 46b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner MachineRelocation(unsigned Offset, unsigned RelocationType, GlobalValue *GV, 47b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner intptr_t cst = 0) 48b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner : OffsetTypeExternal(Offset + (RelocationType << 25)), ConstantVal(cst) { 49b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner assert((Offset & ~((1 << 24)-1)) == 0 && "Code offset too large!"); 50b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner assert((RelocationType & ~127) == 0 && "Relocation type too large!"); 51b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner Target.GV = GV; 52b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner } 53b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner 54b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner MachineRelocation(unsigned Offset, unsigned RelocationType, const char *ES, 55b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner intptr_t cst = 0) 56b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner : OffsetTypeExternal(Offset + (1 << 24) + (RelocationType << 25)), 57b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner ConstantVal(cst) { 58b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner assert((Offset & ~((1 << 24)-1)) == 0 && "Code offset too large!"); 59b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner assert((RelocationType & ~127) == 0 && "Relocation type too large!"); 60b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner Target.ExtSym = ES; 61b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner } 62b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner 63b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner /// getMachineCodeOffset - Return the offset into the code buffer that the 64b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner /// relocation should be performed. 65b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner unsigned getMachineCodeOffset() const { 66b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner return OffsetTypeExternal & ((1 << 24)-1); 67b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner } 68b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner 69b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner /// getConstantVal - Get the constant value associated with this relocation. 70b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner /// This is often an offset from the symbol. 71b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner /// 72b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner intptr_t getConstantVal() const { 73b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner return ConstantVal; 74b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner } 75b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner 76b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner /// isGlobalValue - Return true if this relocation is a GlobalValue, as 77b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner /// opposed to a constant string. 78b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner bool isGlobalValue() const { 79b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner return (OffsetTypeExternal & (1 << 24)) == 0; 80b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner } 81b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner 82b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner /// isString - Return true if this is a constant string. 83b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner /// 84b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner bool isString() const { 85b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner return !isGlobalValue(); 86b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner } 87b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner 88b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner /// getGlobalValue - If this is a global value reference, return the 89b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner /// referenced global. 90b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner GlobalValue *getGlobalValue() const { 91b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner assert(isGlobalValue() && "This is not a global value reference!"); 92b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner return Target.GV; 93b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner } 94b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner 95b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner /// getString - If this is a string value, return the string reference. 96b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner /// 97b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner const char *getString() const { 98b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner assert(isString() && "This is not a string reference!"); 99b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner return Target.ExtSym; 100b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner } 101b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner 102b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner /// getResultPointer - Once this has been resolved to point to an actual 103b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner /// address, this returns the pointer. 104b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner void *getResultPointer() const { 105b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner return Target.Result; 106b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner } 107b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner 108b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner /// setResultPointer - Set the result to the specified pointer value. 109b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner /// 110b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner void setResultPointer(void *Ptr) { 111b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner Target.Result = Ptr; 112b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner } 113b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner}; 114b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner 115b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner} 116b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner 117b89df9cc631aee0d9cf31565fa1ac84b2c92f1a0Chris Lattner#endif 118