TargetInfo.h revision 6374c3307e2d73348f7b8cc73eeeb0998ad0ac94
1//===---- 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;
20  class Value;
21}
22
23namespace clang {
24  class ABIInfo;
25  class Decl;
26
27  namespace CodeGen {
28    class CodeGenModule;
29    class CodeGenFunction;
30  }
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.
39    TargetCodeGenInfo(ABIInfo *info = 0):Info(info) { }
40    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,
48                                     CodeGen::CodeGenModule &M) const { }
49
50    /// Controls whether __builtin_extend_pointer should sign-extend
51    /// pointers to uint64_t or zero-extend them (the default).  Has
52    /// no effect for targets:
53    ///   - that have 64-bit pointers, or
54    ///   - that cannot address through registers larger than pointers, or
55    ///   - that implicitly ignore/truncate the top bits when addressing
56    ///     through such registers.
57    virtual bool extendPointerWithSExt() const { return false; }
58
59    /// Determines the DWARF register number for the stack pointer, for
60    /// exception-handling purposes.  Implements __builtin_dwarf_sp_column.
61    ///
62    /// Returns -1 if the operation is unsupported by this target.
63    virtual int getDwarfEHStackPointer(CodeGen::CodeGenModule &M) const {
64      return -1;
65    }
66
67    /// Initializes the given DWARF EH register-size table, a char*.
68    /// Implements __builtin_init_dwarf_reg_size_table.
69    ///
70    /// Returns true if the operation is unsupported by this target.
71    virtual bool initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF,
72                                         llvm::Value *Address) const {
73      return true;
74    }
75
76    /// Performs the code-generation required to convert a return
77    /// address as stored by the system into the actual address of the
78    /// next instruction that will be executed.
79    ///
80    /// Used by __builtin_extract_return_addr().
81    virtual llvm::Value *decodeReturnAddress(CodeGen::CodeGenFunction &CGF,
82                                             llvm::Value *Address) const {
83      return Address;
84    }
85
86    /// Performs the code-generation required to convert the address
87    /// of an instruction into a return address suitable for storage
88    /// by the system in a return slot.
89    ///
90    /// Used by __builtin_frob_return_addr().
91    virtual llvm::Value *encodeReturnAddress(CodeGen::CodeGenFunction &CGF,
92                                             llvm::Value *Address) const {
93      return Address;
94    }
95  };
96}
97
98#endif // CLANG_CODEGEN_TARGETINFO_H
99