blob: 7d37d956ae3e137211aa799bee27794ecca46c8a [file] [log] [blame]
Bill Wendling40d77642007-01-27 02:54:30 +00001//===-- X86ELFWriterInfo.h - ELF Writer Info for X86 ------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
Chris Lattner4ee451d2007-12-29 20:36:04 +00005// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
Bill Wendling40d77642007-01-27 02:54:30 +00007//
8//===----------------------------------------------------------------------===//
9//
10// This file implements ELF writer information for the X86 backend.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef X86_ELF_WRITER_INFO_H
15#define X86_ELF_WRITER_INFO_H
16
17#include "llvm/Target/TargetELFWriterInfo.h"
18
19namespace llvm {
20
21 class X86ELFWriterInfo : public TargetELFWriterInfo {
Bruno Cardoso Lopes0d3193e2009-06-22 19:16:16 +000022
23 // ELF Relocation types for X86
24 enum X86RelocationType {
25 R_386_NONE = 0,
26 R_386_32 = 1,
27 R_386_PC32 = 2
28 };
29
30 // ELF Relocation types for X86_64
31 enum X86_64RelocationType {
32 R_X86_64_NONE = 0,
33 R_X86_64_64 = 1,
34 R_X86_64_PC32 = 2,
35 R_X86_64_32 = 10,
36 R_X86_64_32S = 11,
37 R_X86_64_PC64 = 24
38 };
39
Bill Wendling40d77642007-01-27 02:54:30 +000040 public:
Rafael Espindola0febc462010-10-03 18:59:45 +000041 X86ELFWriterInfo(bool is64Bit_, bool isLittleEndian_);
Bill Wendling0db1f0b2007-01-27 11:40:32 +000042 virtual ~X86ELFWriterInfo();
Bruno Cardoso Lopesc997d452009-06-11 19:16:03 +000043
Bruno Cardoso Lopes0d3193e2009-06-22 19:16:16 +000044 /// getRelocationType - Returns the target specific ELF Relocation type.
45 /// 'MachineRelTy' contains the object code independent relocation type
46 virtual unsigned getRelocationType(unsigned MachineRelTy) const;
47
48 /// hasRelocationAddend - True if the target uses an addend in the
49 /// ELF relocation entry.
50 virtual bool hasRelocationAddend() const { return is64Bit ? true : false; }
51
Bruno Cardoso Lopes0a38dc52009-07-20 08:52:02 +000052 /// getDefaultAddendForRelTy - Gets the default addend value for a
53 /// relocation entry based on the target ELF relocation type.
Bruno Cardoso Lopes52d08512009-08-05 06:57:03 +000054 virtual long int getDefaultAddendForRelTy(unsigned RelTy,
55 long int Modifier = 0) const;
Bruno Cardoso Lopes171375f2009-07-18 19:30:09 +000056
57 /// getRelTySize - Returns the size of relocatable field in bits
58 virtual unsigned getRelocationTySize(unsigned RelTy) const;
59
Bruno Cardoso Lopes0a38dc52009-07-20 08:52:02 +000060 /// isPCRelativeRel - True if the relocation type is pc relative
61 virtual bool isPCRelativeRel(unsigned RelTy) const;
62
Bruno Cardoso Lopes171375f2009-07-18 19:30:09 +000063 /// getJumpTableRelocationTy - Returns the machine relocation type used
64 /// to reference a jumptable.
Bruno Cardoso Lopes617dd7b2009-07-18 20:52:11 +000065 virtual unsigned getAbsoluteLabelMachineRelTy() const;
Bruno Cardoso Lopes0a38dc52009-07-20 08:52:02 +000066
67 /// computeRelocation - Some relocatable fields could be relocated
68 /// directly, avoiding the relocation symbol emission, compute the
69 /// final relocation value for this symbol.
70 virtual long int computeRelocation(unsigned SymOffset, unsigned RelOffset,
71 unsigned RelTy) const;
Bill Wendling40d77642007-01-27 02:54:30 +000072 };
73
74} // end llvm namespace
75
76#endif // X86_ELF_WRITER_INFO_H