blob: 9d4cf1610308ac9250a2b936b5df4729dd8da692 [file] [log] [blame]
Anton Korobeynikov82d0a412010-01-10 12:58:08 +00001//===---- TargetInfo.h - Encapsulate target details -------------*- 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// These classes wrap the information about a call or function
11// definition used to handle ABI compliancy.
12//
13//===----------------------------------------------------------------------===//
14
15#ifndef CLANG_CODEGEN_TARGETINFO_H
16#define CLANG_CODEGEN_TARGETINFO_H
17
18namespace llvm {
19 class GlobalValue;
John McCall492c4f92010-03-03 04:15:11 +000020 class Value;
Anton Korobeynikov82d0a412010-01-10 12:58:08 +000021}
22
23namespace clang {
24 class ABIInfo;
25 class Decl;
26
27 namespace CodeGen {
28 class CodeGenModule;
John McCall492c4f92010-03-03 04:15:11 +000029 class CodeGenFunction;
Anton Korobeynikov82d0a412010-01-10 12:58:08 +000030 }
31
32 /// TargetCodeGenInfo - This class organizes various target-specific
33 /// codegeneration issues, like target-specific attributes, builtins and so
34 /// on.
35 class TargetCodeGenInfo {
36 ABIInfo *Info;
37 public:
38 // WARNING: Acquires the ownership of ABIInfo.
Douglas Gregor568bb2d2010-01-22 15:41:14 +000039 TargetCodeGenInfo(ABIInfo *info = 0):Info(info) { }
Anton Korobeynikov82d0a412010-01-10 12:58:08 +000040 virtual ~TargetCodeGenInfo();
41
42 /// getABIInfo() - Returns ABI info helper for the target.
43 const ABIInfo& getABIInfo() const { return *Info; }
44
45 /// SetTargetAttributes - Provides a convenient hook to handle extra
46 /// target-specific attributes for the given global.
47 virtual void SetTargetAttributes(const Decl *D, llvm::GlobalValue *GV,
Douglas Gregor568bb2d2010-01-22 15:41:14 +000048 CodeGen::CodeGenModule &M) const { }
John McCalld0b76ca2010-03-02 03:50:12 +000049
John McCall204b0752010-07-20 22:17:55 +000050 /// Determines the size of struct _Unwind_Exception on this platform,
51 /// in 8-bit units. The Itanium ABI defines this as:
52 /// struct _Unwind_Exception {
53 /// uint64 exception_class;
54 /// _Unwind_Exception_Cleanup_Fn exception_cleanup;
55 /// uint64 private_1;
56 /// uint64 private_2;
57 /// };
58 unsigned getSizeOfUnwindException() const { return 32; }
59
John McCalld0b76ca2010-03-02 03:50:12 +000060 /// Controls whether __builtin_extend_pointer should sign-extend
61 /// pointers to uint64_t or zero-extend them (the default). Has
62 /// no effect for targets:
63 /// - that have 64-bit pointers, or
64 /// - that cannot address through registers larger than pointers, or
65 /// - that implicitly ignore/truncate the top bits when addressing
66 /// through such registers.
67 virtual bool extendPointerWithSExt() const { return false; }
John McCall492c4f92010-03-03 04:15:11 +000068
John McCall6374c332010-03-06 00:35:14 +000069 /// Determines the DWARF register number for the stack pointer, for
70 /// exception-handling purposes. Implements __builtin_dwarf_sp_column.
71 ///
72 /// Returns -1 if the operation is unsupported by this target.
73 virtual int getDwarfEHStackPointer(CodeGen::CodeGenModule &M) const {
74 return -1;
75 }
76
77 /// Initializes the given DWARF EH register-size table, a char*.
78 /// Implements __builtin_init_dwarf_reg_size_table.
79 ///
80 /// Returns true if the operation is unsupported by this target.
81 virtual bool initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF,
82 llvm::Value *Address) const {
83 return true;
84 }
85
John McCall492c4f92010-03-03 04:15:11 +000086 /// Performs the code-generation required to convert a return
87 /// address as stored by the system into the actual address of the
88 /// next instruction that will be executed.
89 ///
90 /// Used by __builtin_extract_return_addr().
91 virtual llvm::Value *decodeReturnAddress(CodeGen::CodeGenFunction &CGF,
92 llvm::Value *Address) const {
93 return Address;
94 }
95
96 /// Performs the code-generation required to convert the address
97 /// of an instruction into a return address suitable for storage
98 /// by the system in a return slot.
99 ///
100 /// Used by __builtin_frob_return_addr().
101 virtual llvm::Value *encodeReturnAddress(CodeGen::CodeGenFunction &CGF,
102 llvm::Value *Address) const {
103 return Address;
104 }
Anton Korobeynikov82d0a412010-01-10 12:58:08 +0000105 };
106}
107
108#endif // CLANG_CODEGEN_TARGETINFO_H