TargetInfo.h revision 42e1ee0702d8267d632df0fdb5c479a582877c6f
15f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===--- TargetInfo.h - Expose information about the target -----*- C++ -*-===//
25f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
35f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//                     The LLVM Compiler Infrastructure
45f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
50bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// This file is distributed under the University of Illinois Open Source
60bc735ffcfb223c0186419547abaa5c84482663eChris Lattner// License. See LICENSE.TXT for details.
75f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
85f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
95f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
102b59a2cbfdb93fcf1a4a303e1ea7753ff1c7b319Nate Begeman//  This file defines the TargetInfo interface.
115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#ifndef LLVM_CLANG_BASIC_TARGETINFO_H
155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#define LLVM_CLANG_BASIC_TARGETINFO_H
165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
17b8128140956c6f8f0ab143818775a81f4b4aa477Chris Lattner#include "llvm/Support/DataTypes.h"
185f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include <vector>
195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include <string>
205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
21525a05093a4816af961fe2bc6b8a81c17e2e26c2Chris Lattnernamespace llvm { struct fltSemantics; }
22525a05093a4816af961fe2bc6b8a81c17e2e26c2Chris Lattner
235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencernamespace clang {
245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass Diagnostic;
267a9d49fd2bfac00e905b361ba76d26ab5b6c3b09Ted Kremenekclass SourceManager;
278fc4dfb30e8bd94ca2ea7adb6cbece04fb96cd99Chris Lattnerclass LangOptions;
287a9d49fd2bfac00e905b361ba76d26ab5b6c3b09Ted Kremenek
295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencernamespace Builtin { struct Info; }
305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3142e6737f2efb113563140ad794c21c7709250402Chris Lattner/// TargetInfo - This class exposes information about the current target.
325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer///
335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass TargetInfo {
340eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner  std::string Triple;
350eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattnerprotected:
36cd4fc42896f926ffc081e1c4a8bf4cd647883c14Chris Lattner  // Target values set by the ctor of the actual target implementation.  Default
37cd4fc42896f926ffc081e1c4a8bf4cd647883c14Chris Lattner  // values are specified by the TargetInfo constructor.
389e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner  bool CharIsSigned;
39927686fe8c968ca786fa44d2353eebf59c4f5b8aChris Lattner  unsigned char PointerWidth, PointerAlign;
40927686fe8c968ca786fa44d2353eebf59c4f5b8aChris Lattner  unsigned char WCharWidth, WCharAlign;
41927686fe8c968ca786fa44d2353eebf59c4f5b8aChris Lattner  unsigned char IntWidth, IntAlign;
4261538a7d1336f3ef3cb81e09f11a1cbb282bcf81Eli Friedman  unsigned char FloatWidth, FloatAlign;
43927686fe8c968ca786fa44d2353eebf59c4f5b8aChris Lattner  unsigned char DoubleWidth, DoubleAlign;
4461538a7d1336f3ef3cb81e09f11a1cbb282bcf81Eli Friedman  unsigned char LongDoubleWidth, LongDoubleAlign;
45927686fe8c968ca786fa44d2353eebf59c4f5b8aChris Lattner  unsigned char LongWidth, LongAlign;
46927686fe8c968ca786fa44d2353eebf59c4f5b8aChris Lattner  unsigned char LongLongWidth, LongLongAlign;
4722b9d5a1fd9067785b62d9237bae6ee2a9b40afcNate Begeman  unsigned char IntMaxTWidth;
4877e8b53fe3ff630d8d1454db94e38bedda14d5caDaniel Dunbar  const char *DescriptionString;
493fdf4678935b27c3d3fd4eb10bf9f5ab98dc0d99Chris Lattner  const char *UserLabelPrefix;
50cd4fc42896f926ffc081e1c4a8bf4cd647883c14Chris Lattner  const llvm::fltSemantics *FloatFormat, *DoubleFormat, *LongDoubleFormat;
51bbced580c92afa09cd4423a9bdc90ff61cb1e79aTed Kremenek
52cd4fc42896f926ffc081e1c4a8bf4cd647883c14Chris Lattner  // TargetInfo Constructor.  Default initializes all fields.
53cd4fc42896f926ffc081e1c4a8bf4cd647883c14Chris Lattner  TargetInfo(const std::string &T);
54390161183919169c493916efac4c1e1b3828fea6Chris Lattner
55bbced580c92afa09cd4423a9bdc90ff61cb1e79aTed Kremenekpublic:
5642e6737f2efb113563140ad794c21c7709250402Chris Lattner  /// CreateTargetInfo - Return the target info object for the specified target
5742e6737f2efb113563140ad794c21c7709250402Chris Lattner  /// triple.
5842e6737f2efb113563140ad794c21c7709250402Chris Lattner  static TargetInfo* CreateTargetInfo(const std::string &Triple);
59bbced580c92afa09cd4423a9bdc90ff61cb1e79aTed Kremenek
600eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner  virtual ~TargetInfo();
61fb79f7cc00f9c1e04f11ed636eefb36d246b0fb8Ted Kremenek
629c4bea1fa7291035325575c02d33552a124d8ef3Chris Lattner  ///===---- Target Data Type Query Methods -------------------------------===//
6331fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta  enum IntType {
6431fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta    NoInt = 0x0,
6531fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta    SignedShort,
6631fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta    UnsignedShort,
6731fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta    SignedInt,
6831fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta    UnsignedInt,
6931fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta    SignedLong,
7031fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta    UnsignedLong,
7131fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta    SignedLongLong,
7231fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta    UnsignedLongLong
7331fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta  } SizeType, IntMaxType, UIntMaxType, PtrDiffType, WCharType;
7431fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta  enum IntType getSizeType() const {return SizeType;}
7531fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta  enum IntType getIntMaxType() const {return IntMaxType;}
7631fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta  enum IntType getUIntMaxType() const {return UIntMaxType;}
7731fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta  enum IntType getPtrDiffType(unsigned AddrSpace) const {
7831fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta    return AddrSpace == 0 ? PtrDiffType : getPtrDiffTypeV(AddrSpace);
7931fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta  }
8031fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta  enum IntType getWCharType() const {return WCharType;}
815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// isCharSigned - Return true if 'char' is 'signed char' or false if it is
835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// treated as 'unsigned char'.  This is implementation defined according to
845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// C99 6.2.5p15.  In our implementation, this is target-specific.
859e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner  bool isCharSigned() const { return CharIsSigned; }
865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
87f72a44330b9d9a4b2d93e9b91cfb8ab7bd4a0643Chris Lattner  /// getPointerWidth - Return the width of pointers on this target, for the
88927686fe8c968ca786fa44d2353eebf59c4f5b8aChris Lattner  /// specified address space.
89927686fe8c968ca786fa44d2353eebf59c4f5b8aChris Lattner  uint64_t getPointerWidth(unsigned AddrSpace) const {
90927686fe8c968ca786fa44d2353eebf59c4f5b8aChris Lattner    return AddrSpace == 0 ? PointerWidth : getPointerWidthV(AddrSpace);
91927686fe8c968ca786fa44d2353eebf59c4f5b8aChris Lattner  }
92927686fe8c968ca786fa44d2353eebf59c4f5b8aChris Lattner  uint64_t getPointerAlign(unsigned AddrSpace) const {
93927686fe8c968ca786fa44d2353eebf59c4f5b8aChris Lattner    return AddrSpace == 0 ? PointerAlign : getPointerAlignV(AddrSpace);
94927686fe8c968ca786fa44d2353eebf59c4f5b8aChris Lattner  }
955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
969e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner  /// getBoolWidth/Align - Return the size of '_Bool' and C++ 'bool' for this
979e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner  /// target, in bits.
989e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner  unsigned getBoolWidth(bool isWide = false) const { return 8; }  // FIXME
999e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner  unsigned getBoolAlign(bool isWide = false) const { return 8; }  // FIXME
1005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1019e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner  unsigned getCharWidth(bool isWide = false) const {
1029e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner    return isWide ? getWCharWidth() : 8; // FIXME
1035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1049e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner  unsigned getCharAlign(bool isWide = false) const {
1059e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner    return isWide ? getWCharAlign() : 8; // FIXME
1065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1089e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner  /// getShortWidth/Align - Return the size of 'signed short' and
1099e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner  /// 'unsigned short' for this target, in bits.
1109e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner  unsigned getShortWidth() const { return 16; } // FIXME
1119e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner  unsigned getShortAlign() const { return 16; } // FIXME
1125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1139e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner  /// getIntWidth/Align - Return the size of 'signed int' and 'unsigned int' for
1149e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner  /// this target, in bits.
1152621fd1d6d3c5eadcae246859f62738645df7540Chris Lattner  unsigned getIntWidth() const { return IntWidth; }
1162621fd1d6d3c5eadcae246859f62738645df7540Chris Lattner  unsigned getIntAlign() const { return IntAlign; }
1175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1189e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner  /// getLongWidth/Align - Return the size of 'signed long' and 'unsigned long'
1199e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner  /// for this target, in bits.
1208059e997ee05e4aa87f7e21fed630429a140ee53Chris Lattner  unsigned getLongWidth() const { return LongWidth; }
1218059e997ee05e4aa87f7e21fed630429a140ee53Chris Lattner  unsigned getLongAlign() const { return LongAlign; }
122692233e90a99c3a81dd04879d36eb9688f137c44Chris Lattner
1239e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner  /// getLongLongWidth/Align - Return the size of 'signed long long' and
1249e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner  /// 'unsigned long long' for this target, in bits.
125ec10f5886526124ba733fbd0ef8665d576285daaChris Lattner  unsigned getLongLongWidth() const { return LongLongWidth; }
126ec10f5886526124ba733fbd0ef8665d576285daaChris Lattner  unsigned getLongLongAlign() const { return LongLongAlign; }
1279e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner
1289e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner  /// getWcharWidth/Align - Return the size of 'wchar_t' for this target, in
1299e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner  /// bits.
130f72a44330b9d9a4b2d93e9b91cfb8ab7bd4a0643Chris Lattner  unsigned getWCharWidth() const { return WCharWidth; }
131f72a44330b9d9a4b2d93e9b91cfb8ab7bd4a0643Chris Lattner  unsigned getWCharAlign() const { return WCharAlign; }
132f72a44330b9d9a4b2d93e9b91cfb8ab7bd4a0643Chris Lattner
1339e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner  /// getFloatWidth/Align/Format - Return the size/align/format of 'float'.
13461538a7d1336f3ef3cb81e09f11a1cbb282bcf81Eli Friedman  unsigned getFloatWidth() const { return FloatWidth; }
13561538a7d1336f3ef3cb81e09f11a1cbb282bcf81Eli Friedman  unsigned getFloatAlign() const { return FloatAlign; }
136b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner  const llvm::fltSemantics &getFloatFormat() const { return *FloatFormat; }
1379e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner
1389e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner  /// getDoubleWidth/Align/Format - Return the size/align/format of 'double'.
139c8b1227fa8c17d9881815e40c04e19334be536f8Nate Begeman  unsigned getDoubleWidth() const { return DoubleWidth; }
140c8b1227fa8c17d9881815e40c04e19334be536f8Nate Begeman  unsigned getDoubleAlign() const { return DoubleAlign; }
141b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner  const llvm::fltSemantics &getDoubleFormat() const { return *DoubleFormat; }
1429e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner
1439e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner  /// getLongDoubleWidth/Align/Format - Return the size/align/format of 'long
1449e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner  /// double'.
14561538a7d1336f3ef3cb81e09f11a1cbb282bcf81Eli Friedman  unsigned getLongDoubleWidth() const { return LongDoubleWidth; }
14661538a7d1336f3ef3cb81e09f11a1cbb282bcf81Eli Friedman  unsigned getLongDoubleAlign() const { return LongDoubleAlign; }
147b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner  const llvm::fltSemantics &getLongDoubleFormat() const {
148b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner    return *LongDoubleFormat;
149cd4fc42896f926ffc081e1c4a8bf4cd647883c14Chris Lattner  }
1509e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner
1515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// getIntMaxTWidth - Return the size of intmax_t and uintmax_t for this
1525f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// target, in bits.
1530eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner  unsigned getIntMaxTWidth() const {
15422b9d5a1fd9067785b62d9237bae6ee2a9b40afcNate Begeman    return IntMaxTWidth;
1555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1573fdf4678935b27c3d3fd4eb10bf9f5ab98dc0d99Chris Lattner  /// getUserLabelPrefix - This returns the default value of the
1583fdf4678935b27c3d3fd4eb10bf9f5ab98dc0d99Chris Lattner  /// __USER_LABEL_PREFIX__ macro, which is the prefix given to user symbols by
1593fdf4678935b27c3d3fd4eb10bf9f5ab98dc0d99Chris Lattner  /// default.  On most platforms this is "_", but it is "" on some, and "." on
1603fdf4678935b27c3d3fd4eb10bf9f5ab98dc0d99Chris Lattner  /// others.
1613fdf4678935b27c3d3fd4eb10bf9f5ab98dc0d99Chris Lattner  const char *getUserLabelPrefix() const {
1623fdf4678935b27c3d3fd4eb10bf9f5ab98dc0d99Chris Lattner    return UserLabelPrefix;
1633fdf4678935b27c3d3fd4eb10bf9f5ab98dc0d99Chris Lattner  }
1643fdf4678935b27c3d3fd4eb10bf9f5ab98dc0d99Chris Lattner
1659c4bea1fa7291035325575c02d33552a124d8ef3Chris Lattner  ///===---- Other target property query methods --------------------------===//
1669c4bea1fa7291035325575c02d33552a124d8ef3Chris Lattner
1679c4bea1fa7291035325575c02d33552a124d8ef3Chris Lattner  /// getTargetDefines - Appends the target-specific #define values for this
1689c4bea1fa7291035325575c02d33552a124d8ef3Chris Lattner  /// target set to the specified buffer.
1699c4bea1fa7291035325575c02d33552a124d8ef3Chris Lattner  virtual void getTargetDefines(std::vector<char> &DefineBuffer) const = 0;
1709c4bea1fa7291035325575c02d33552a124d8ef3Chris Lattner
1715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// getTargetBuiltins - Return information about target-specific builtins for
1725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// the current primary target, and info about which builtins are non-portable
1735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// across the current set of primary and secondary targets.
1740eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner  virtual void getTargetBuiltins(const Builtin::Info *&Records,
1750eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner                                 unsigned &NumRecords) const = 0;
1765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
177d19144b244f86227fcc2b0da794929fe83968dd5Chris Lattner  /// getVAListDeclaration - Return the declaration to use for
178d19144b244f86227fcc2b0da794929fe83968dd5Chris Lattner  /// __builtin_va_list, which is target-specific.
1790eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner  virtual const char *getVAListDeclaration() const = 0;
180fb5e5ba3c7708f3aef4db0ed30e8470b3ed4206aAnders Carlsson
1813346ae6bba10da0d08c8d548134ddab4e13d040fAnders Carlsson  /// isValidGCCRegisterName - Returns whether the passed in string
1823346ae6bba10da0d08c8d548134ddab4e13d040fAnders Carlsson  /// is a valid register name according to GCC. This is used by Sema for
1833346ae6bba10da0d08c8d548134ddab4e13d040fAnders Carlsson  /// inline asm statements.
1843346ae6bba10da0d08c8d548134ddab4e13d040fAnders Carlsson  bool isValidGCCRegisterName(const char *Name) const;
185d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson
186d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  // getNormalizedGCCRegisterName - Returns the "normalized" GCC register name.
187d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  // For example, on x86 it will return "ax" when "eax" is passed in.
188d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  const char *getNormalizedGCCRegisterName(const char *Name) const;
189d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson
190d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  enum ConstraintInfo {
191d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson    CI_None = 0x00,
192d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson    CI_AllowsMemory = 0x01,
193d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson    CI_AllowsRegister = 0x02,
194ef09d2b70a3b6f04c5d31c4c2bab2b7849f22561Anders Carlsson    CI_ReadWrite = 0x04
195d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  };
196d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson
197d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  // validateOutputConstraint, validateInputConstraint - Checks that
198d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  // a constraint is valid and provides information about it.
199d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  // FIXME: These should return a real error instead of just true/false.
200d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  bool validateOutputConstraint(const char *Name, ConstraintInfo &Info) const;
20145b050e72d058131e6f169fe54888bb91a003fb5Anders Carlsson  bool validateInputConstraint(const char *Name,
20245b050e72d058131e6f169fe54888bb91a003fb5Anders Carlsson                               const std::string *OutputNamesBegin,
20345b050e72d058131e6f169fe54888bb91a003fb5Anders Carlsson                               const std::string *OutputNamesEnd,
20445b050e72d058131e6f169fe54888bb91a003fb5Anders Carlsson                               ConstraintInfo &info) const;
20542e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson  bool resolveSymbolicName(const char *&Name,
20642e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson                           const std::string *OutputNamesBegin,
20742e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson                           const std::string *OutputNamesEnd,
20842e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson                           unsigned &Index) const;
20942e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson
2100eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner  virtual std::string convertConstraint(const char Constraint) const {
2110eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner    return std::string(1, Constraint);
2120eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner  }
213d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson
214d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  // Returns a string of target-specific clobbers, in LLVM format.
2150eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner  virtual const char *getClobbers() const = 0;
216d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson
2177a4718e813e5e99d478567a482217c7eef8572c5Devang Patel
21844fe49c9ccf29b8e9b66ce1f2375be6ec591c03cAnders Carlsson  /// getTargetPrefix - Return the target prefix used for identifying
21944fe49c9ccf29b8e9b66ce1f2375be6ec591c03cAnders Carlsson  /// llvm intrinsics.
2200eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner  virtual const char *getTargetPrefix() const = 0;
22144fe49c9ccf29b8e9b66ce1f2375be6ec591c03cAnders Carlsson
222ae3607684c5978dc2d877141015056c9d24f17eaTed Kremenek  /// getTargetTriple - Return the target triple of the primary target.
2239e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner  const char *getTargetTriple() const {
2240eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner    return Triple.c_str();
2250eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner  }
226ae3607684c5978dc2d877141015056c9d24f17eaTed Kremenek
227ae3607684c5978dc2d877141015056c9d24f17eaTed Kremenek  const char *getTargetDescription() const {
228364af81157a81cf34bb058a7d5b0185020e5164bSanjiv Gupta    return DescriptionString;
2297a4718e813e5e99d478567a482217c7eef8572c5Devang Patel  }
2303346ae6bba10da0d08c8d548134ddab4e13d040fAnders Carlsson
2313346ae6bba10da0d08c8d548134ddab4e13d040fAnders Carlsson  struct GCCRegAlias {
2323346ae6bba10da0d08c8d548134ddab4e13d040fAnders Carlsson    const char * const Aliases[5];
2333346ae6bba10da0d08c8d548134ddab4e13d040fAnders Carlsson    const char * const Register;
2343346ae6bba10da0d08c8d548134ddab4e13d040fAnders Carlsson  };
2352621fd1d6d3c5eadcae246859f62738645df7540Chris Lattner
236dcb4a1a6dd55fdf6c073d2761096f42e26be105aDaniel Dunbar  virtual bool useGlobalsForAutomaticVariables() const { return false; }
237dcb4a1a6dd55fdf6c073d2761096f42e26be105aDaniel Dunbar
2388fc4dfb30e8bd94ca2ea7adb6cbece04fb96cd99Chris Lattner  /// getDefaultLangOptions - Allow the target to specify default settings for
2398fc4dfb30e8bd94ca2ea7adb6cbece04fb96cd99Chris Lattner  /// various language options.  These may be overridden by command line
2408fc4dfb30e8bd94ca2ea7adb6cbece04fb96cd99Chris Lattner  /// options.
2418fc4dfb30e8bd94ca2ea7adb6cbece04fb96cd99Chris Lattner  virtual void getDefaultLangOptions(LangOptions &Opts) {}
242dcb4a1a6dd55fdf6c073d2761096f42e26be105aDaniel Dunbar
2430eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattnerprotected:
2440e5d4ef3155651af17a90fdc07d9f80b33935c0cChris Lattner  virtual uint64_t getPointerWidthV(unsigned AddrSpace) const {
2450e5d4ef3155651af17a90fdc07d9f80b33935c0cChris Lattner    return PointerWidth;
2460e5d4ef3155651af17a90fdc07d9f80b33935c0cChris Lattner  }
2470e5d4ef3155651af17a90fdc07d9f80b33935c0cChris Lattner  virtual uint64_t getPointerAlignV(unsigned AddrSpace) const {
2480e5d4ef3155651af17a90fdc07d9f80b33935c0cChris Lattner    return PointerAlign;
2490e5d4ef3155651af17a90fdc07d9f80b33935c0cChris Lattner  }
25031fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta  virtual enum IntType getPtrDiffTypeV(unsigned AddrSpace) const {
25131fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta    return PtrDiffType;
25231fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta  }
2530eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner  virtual void getGCCRegNames(const char * const *&Names,
2540eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner                              unsigned &NumNames) const = 0;
2553346ae6bba10da0d08c8d548134ddab4e13d040fAnders Carlsson  virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2563346ae6bba10da0d08c8d548134ddab4e13d040fAnders Carlsson                                unsigned &NumAliases) const = 0;
257d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  virtual bool validateAsmConstraint(char c,
258d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson                                     TargetInfo::ConstraintInfo &info) const= 0;
2595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
2605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}  // end namespace clang
2625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#endif
264