TargetInfo.h revision 2819fa85651526d59ade4fdc9da2cadd7b132973
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"
185414fbac5f1749c0e85a8c4eeb5dfece59c3e30aTorok Edwin#include <cassert>
195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include <vector>
205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include <string>
215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
22525a05093a4816af961fe2bc6b8a81c17e2e26c2Chris Lattnernamespace llvm { struct fltSemantics; }
23525a05093a4816af961fe2bc6b8a81c17e2e26c2Chris Lattner
245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencernamespace clang {
255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass Diagnostic;
277a9d49fd2bfac00e905b361ba76d26ab5b6c3b09Ted Kremenekclass SourceManager;
288fc4dfb30e8bd94ca2ea7adb6cbece04fb96cd99Chris Lattnerclass LangOptions;
297a9d49fd2bfac00e905b361ba76d26ab5b6c3b09Ted Kremenek
305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencernamespace Builtin { struct Info; }
315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3242e6737f2efb113563140ad794c21c7709250402Chris Lattner/// TargetInfo - This class exposes information about the current target.
335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer///
345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass TargetInfo {
350eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner  std::string Triple;
360eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattnerprotected:
37cd4fc42896f926ffc081e1c4a8bf4cd647883c14Chris Lattner  // Target values set by the ctor of the actual target implementation.  Default
38cd4fc42896f926ffc081e1c4a8bf4cd647883c14Chris Lattner  // values are specified by the TargetInfo constructor.
399e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner  bool CharIsSigned;
40b030f0272500c6c5602f587ac029ee0dc0e5a05cEli Friedman  bool TLSSupported;
41927686fe8c968ca786fa44d2353eebf59c4f5b8aChris Lattner  unsigned char PointerWidth, PointerAlign;
42927686fe8c968ca786fa44d2353eebf59c4f5b8aChris Lattner  unsigned char WCharWidth, WCharAlign;
43927686fe8c968ca786fa44d2353eebf59c4f5b8aChris Lattner  unsigned char IntWidth, IntAlign;
4461538a7d1336f3ef3cb81e09f11a1cbb282bcf81Eli Friedman  unsigned char FloatWidth, FloatAlign;
45927686fe8c968ca786fa44d2353eebf59c4f5b8aChris Lattner  unsigned char DoubleWidth, DoubleAlign;
4661538a7d1336f3ef3cb81e09f11a1cbb282bcf81Eli Friedman  unsigned char LongDoubleWidth, LongDoubleAlign;
47927686fe8c968ca786fa44d2353eebf59c4f5b8aChris Lattner  unsigned char LongWidth, LongAlign;
48927686fe8c968ca786fa44d2353eebf59c4f5b8aChris Lattner  unsigned char LongLongWidth, LongLongAlign;
4922b9d5a1fd9067785b62d9237bae6ee2a9b40afcNate Begeman  unsigned char IntMaxTWidth;
5077e8b53fe3ff630d8d1454db94e38bedda14d5caDaniel Dunbar  const char *DescriptionString;
513fdf4678935b27c3d3fd4eb10bf9f5ab98dc0d99Chris Lattner  const char *UserLabelPrefix;
52cd4fc42896f926ffc081e1c4a8bf4cd647883c14Chris Lattner  const llvm::fltSemantics *FloatFormat, *DoubleFormat, *LongDoubleFormat;
53264a76cdf382c507f4d43e64c89f1503f003ac95Anton Korobeynikov  unsigned char RegParmMax, SSERegParmMax;
54bbced580c92afa09cd4423a9bdc90ff61cb1e79aTed Kremenek
55cd4fc42896f926ffc081e1c4a8bf4cd647883c14Chris Lattner  // TargetInfo Constructor.  Default initializes all fields.
56cd4fc42896f926ffc081e1c4a8bf4cd647883c14Chris Lattner  TargetInfo(const std::string &T);
57390161183919169c493916efac4c1e1b3828fea6Chris Lattner
58bbced580c92afa09cd4423a9bdc90ff61cb1e79aTed Kremenekpublic:
5942e6737f2efb113563140ad794c21c7709250402Chris Lattner  /// CreateTargetInfo - Return the target info object for the specified target
6042e6737f2efb113563140ad794c21c7709250402Chris Lattner  /// triple.
6142e6737f2efb113563140ad794c21c7709250402Chris Lattner  static TargetInfo* CreateTargetInfo(const std::string &Triple);
62bbced580c92afa09cd4423a9bdc90ff61cb1e79aTed Kremenek
630eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner  virtual ~TargetInfo();
64fb79f7cc00f9c1e04f11ed636eefb36d246b0fb8Ted Kremenek
659c4bea1fa7291035325575c02d33552a124d8ef3Chris Lattner  ///===---- Target Data Type Query Methods -------------------------------===//
6631fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta  enum IntType {
672b5abf515f9696912452f431c7738691cf97f4f1Chris Lattner    NoInt = 0,
6831fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta    SignedShort,
6931fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta    UnsignedShort,
7031fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta    SignedInt,
7131fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta    UnsignedInt,
7231fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta    SignedLong,
7331fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta    UnsignedLong,
7431fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta    SignedLongLong,
7531fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta    UnsignedLongLong
763fa8f7491a6a6c1445768ea23ec85d3554c3ba98Chris Lattner  };
773fa8f7491a6a6c1445768ea23ec85d3554c3ba98Chris Lattnerprotected:
786ad474f82f0cf32e13128d89fa5ad3a37ae73530Chris Lattner  IntType SizeType, IntMaxType, UIntMaxType, PtrDiffType, IntPtrType, WCharType;
793fa8f7491a6a6c1445768ea23ec85d3554c3ba98Chris Lattnerpublic:
803fa8f7491a6a6c1445768ea23ec85d3554c3ba98Chris Lattner  IntType getSizeType() const { return SizeType; }
813fa8f7491a6a6c1445768ea23ec85d3554c3ba98Chris Lattner  IntType getIntMaxType() const { return IntMaxType; }
823fa8f7491a6a6c1445768ea23ec85d3554c3ba98Chris Lattner  IntType getUIntMaxType() const { return UIntMaxType; }
833fa8f7491a6a6c1445768ea23ec85d3554c3ba98Chris Lattner  IntType getPtrDiffType(unsigned AddrSpace) const {
8431fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta    return AddrSpace == 0 ? PtrDiffType : getPtrDiffTypeV(AddrSpace);
8531fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta  }
866ad474f82f0cf32e13128d89fa5ad3a37ae73530Chris Lattner  IntType getIntPtrType() const { return IntPtrType; }
873fa8f7491a6a6c1445768ea23ec85d3554c3ba98Chris Lattner  IntType getWCharType() const { return WCharType; }
885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// isCharSigned - Return true if 'char' is 'signed char' or false if it is
905f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// treated as 'unsigned char'.  This is implementation defined according to
915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// C99 6.2.5p15.  In our implementation, this is target-specific.
929e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner  bool isCharSigned() const { return CharIsSigned; }
935f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
94f72a44330b9d9a4b2d93e9b91cfb8ab7bd4a0643Chris Lattner  /// getPointerWidth - Return the width of pointers on this target, for the
95927686fe8c968ca786fa44d2353eebf59c4f5b8aChris Lattner  /// specified address space.
96927686fe8c968ca786fa44d2353eebf59c4f5b8aChris Lattner  uint64_t getPointerWidth(unsigned AddrSpace) const {
97927686fe8c968ca786fa44d2353eebf59c4f5b8aChris Lattner    return AddrSpace == 0 ? PointerWidth : getPointerWidthV(AddrSpace);
98927686fe8c968ca786fa44d2353eebf59c4f5b8aChris Lattner  }
99927686fe8c968ca786fa44d2353eebf59c4f5b8aChris Lattner  uint64_t getPointerAlign(unsigned AddrSpace) const {
100927686fe8c968ca786fa44d2353eebf59c4f5b8aChris Lattner    return AddrSpace == 0 ? PointerAlign : getPointerAlignV(AddrSpace);
101927686fe8c968ca786fa44d2353eebf59c4f5b8aChris Lattner  }
1025f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1039e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner  /// getBoolWidth/Align - Return the size of '_Bool' and C++ 'bool' for this
1049e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner  /// target, in bits.
1059e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner  unsigned getBoolWidth(bool isWide = false) const { return 8; }  // FIXME
1069e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner  unsigned getBoolAlign(bool isWide = false) const { return 8; }  // FIXME
1075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1089e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner  unsigned getCharWidth(bool isWide = false) const {
1099e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner    return isWide ? getWCharWidth() : 8; // FIXME
1105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1119e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner  unsigned getCharAlign(bool isWide = false) const {
1129e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner    return isWide ? getWCharAlign() : 8; // FIXME
1135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1159e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner  /// getShortWidth/Align - Return the size of 'signed short' and
1169e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner  /// 'unsigned short' for this target, in bits.
1179e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner  unsigned getShortWidth() const { return 16; } // FIXME
1189e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner  unsigned getShortAlign() const { return 16; } // FIXME
1195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1209e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner  /// getIntWidth/Align - Return the size of 'signed int' and 'unsigned int' for
1219e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner  /// this target, in bits.
1222621fd1d6d3c5eadcae246859f62738645df7540Chris Lattner  unsigned getIntWidth() const { return IntWidth; }
1232621fd1d6d3c5eadcae246859f62738645df7540Chris Lattner  unsigned getIntAlign() const { return IntAlign; }
1245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1259e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner  /// getLongWidth/Align - Return the size of 'signed long' and 'unsigned long'
1269e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner  /// for this target, in bits.
1278059e997ee05e4aa87f7e21fed630429a140ee53Chris Lattner  unsigned getLongWidth() const { return LongWidth; }
1288059e997ee05e4aa87f7e21fed630429a140ee53Chris Lattner  unsigned getLongAlign() const { return LongAlign; }
129692233e90a99c3a81dd04879d36eb9688f137c44Chris Lattner
1309e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner  /// getLongLongWidth/Align - Return the size of 'signed long long' and
1319e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner  /// 'unsigned long long' for this target, in bits.
132ec10f5886526124ba733fbd0ef8665d576285daaChris Lattner  unsigned getLongLongWidth() const { return LongLongWidth; }
133ec10f5886526124ba733fbd0ef8665d576285daaChris Lattner  unsigned getLongLongAlign() const { return LongLongAlign; }
1349e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner
1359e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner  /// getWcharWidth/Align - Return the size of 'wchar_t' for this target, in
1369e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner  /// bits.
137f72a44330b9d9a4b2d93e9b91cfb8ab7bd4a0643Chris Lattner  unsigned getWCharWidth() const { return WCharWidth; }
138f72a44330b9d9a4b2d93e9b91cfb8ab7bd4a0643Chris Lattner  unsigned getWCharAlign() const { return WCharAlign; }
139f72a44330b9d9a4b2d93e9b91cfb8ab7bd4a0643Chris Lattner
1409e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner  /// getFloatWidth/Align/Format - Return the size/align/format of 'float'.
14161538a7d1336f3ef3cb81e09f11a1cbb282bcf81Eli Friedman  unsigned getFloatWidth() const { return FloatWidth; }
14261538a7d1336f3ef3cb81e09f11a1cbb282bcf81Eli Friedman  unsigned getFloatAlign() const { return FloatAlign; }
143b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner  const llvm::fltSemantics &getFloatFormat() const { return *FloatFormat; }
1449e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner
1459e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner  /// getDoubleWidth/Align/Format - Return the size/align/format of 'double'.
146c8b1227fa8c17d9881815e40c04e19334be536f8Nate Begeman  unsigned getDoubleWidth() const { return DoubleWidth; }
147c8b1227fa8c17d9881815e40c04e19334be536f8Nate Begeman  unsigned getDoubleAlign() const { return DoubleAlign; }
148b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner  const llvm::fltSemantics &getDoubleFormat() const { return *DoubleFormat; }
1499e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner
1509e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner  /// getLongDoubleWidth/Align/Format - Return the size/align/format of 'long
1519e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner  /// double'.
15261538a7d1336f3ef3cb81e09f11a1cbb282bcf81Eli Friedman  unsigned getLongDoubleWidth() const { return LongDoubleWidth; }
15361538a7d1336f3ef3cb81e09f11a1cbb282bcf81Eli Friedman  unsigned getLongDoubleAlign() const { return LongDoubleAlign; }
154b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner  const llvm::fltSemantics &getLongDoubleFormat() const {
155b7cfe88e88cb4f46308de89cf3f0c81bfe624128Chris Lattner    return *LongDoubleFormat;
156cd4fc42896f926ffc081e1c4a8bf4cd647883c14Chris Lattner  }
1579e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner
1585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// getIntMaxTWidth - Return the size of intmax_t and uintmax_t for this
1595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// target, in bits.
1600eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner  unsigned getIntMaxTWidth() const {
16122b9d5a1fd9067785b62d9237bae6ee2a9b40afcNate Begeman    return IntMaxTWidth;
1625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1643fdf4678935b27c3d3fd4eb10bf9f5ab98dc0d99Chris Lattner  /// getUserLabelPrefix - This returns the default value of the
1653fdf4678935b27c3d3fd4eb10bf9f5ab98dc0d99Chris Lattner  /// __USER_LABEL_PREFIX__ macro, which is the prefix given to user symbols by
1663fdf4678935b27c3d3fd4eb10bf9f5ab98dc0d99Chris Lattner  /// default.  On most platforms this is "_", but it is "" on some, and "." on
1673fdf4678935b27c3d3fd4eb10bf9f5ab98dc0d99Chris Lattner  /// others.
1683fdf4678935b27c3d3fd4eb10bf9f5ab98dc0d99Chris Lattner  const char *getUserLabelPrefix() const {
1693fdf4678935b27c3d3fd4eb10bf9f5ab98dc0d99Chris Lattner    return UserLabelPrefix;
1703fdf4678935b27c3d3fd4eb10bf9f5ab98dc0d99Chris Lattner  }
1713fdf4678935b27c3d3fd4eb10bf9f5ab98dc0d99Chris Lattner
1722b5abf515f9696912452f431c7738691cf97f4f1Chris Lattner  /// getTypeName - Return the user string for the specified integer type enum.
1732b5abf515f9696912452f431c7738691cf97f4f1Chris Lattner  /// For example, SignedShort -> "short".
1742b5abf515f9696912452f431c7738691cf97f4f1Chris Lattner  static const char *getTypeName(IntType T);
1752b5abf515f9696912452f431c7738691cf97f4f1Chris Lattner
1769c4bea1fa7291035325575c02d33552a124d8ef3Chris Lattner  ///===---- Other target property query methods --------------------------===//
1779c4bea1fa7291035325575c02d33552a124d8ef3Chris Lattner
1789c4bea1fa7291035325575c02d33552a124d8ef3Chris Lattner  /// getTargetDefines - Appends the target-specific #define values for this
1799c4bea1fa7291035325575c02d33552a124d8ef3Chris Lattner  /// target set to the specified buffer.
18033328642a7a8a126918814ddcbcebf83c121ad54Chris Lattner  virtual void getTargetDefines(const LangOptions &Opts,
18133328642a7a8a126918814ddcbcebf83c121ad54Chris Lattner                                std::vector<char> &DefineBuffer) const = 0;
1829c4bea1fa7291035325575c02d33552a124d8ef3Chris Lattner
1835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// getTargetBuiltins - Return information about target-specific builtins for
1845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// the current primary target, and info about which builtins are non-portable
1855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// across the current set of primary and secondary targets.
1860eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner  virtual void getTargetBuiltins(const Builtin::Info *&Records,
1870eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner                                 unsigned &NumRecords) const = 0;
1885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
189d19144b244f86227fcc2b0da794929fe83968dd5Chris Lattner  /// getVAListDeclaration - Return the declaration to use for
190d19144b244f86227fcc2b0da794929fe83968dd5Chris Lattner  /// __builtin_va_list, which is target-specific.
1910eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner  virtual const char *getVAListDeclaration() const = 0;
192fb5e5ba3c7708f3aef4db0ed30e8470b3ed4206aAnders Carlsson
1933346ae6bba10da0d08c8d548134ddab4e13d040fAnders Carlsson  /// isValidGCCRegisterName - Returns whether the passed in string
1943346ae6bba10da0d08c8d548134ddab4e13d040fAnders Carlsson  /// is a valid register name according to GCC. This is used by Sema for
1953346ae6bba10da0d08c8d548134ddab4e13d040fAnders Carlsson  /// inline asm statements.
1963346ae6bba10da0d08c8d548134ddab4e13d040fAnders Carlsson  bool isValidGCCRegisterName(const char *Name) const;
197d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson
198d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  // getNormalizedGCCRegisterName - Returns the "normalized" GCC register name.
199d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  // For example, on x86 it will return "ax" when "eax" is passed in.
200d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  const char *getNormalizedGCCRegisterName(const char *Name) const;
201d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson
20244def070435a2b5d67f0534f7a3a85a7389d60f2Chris Lattner  struct ConstraintInfo {
20344def070435a2b5d67f0534f7a3a85a7389d60f2Chris Lattner    enum {
20444def070435a2b5d67f0534f7a3a85a7389d60f2Chris Lattner      CI_None = 0x00,
20544def070435a2b5d67f0534f7a3a85a7389d60f2Chris Lattner      CI_AllowsMemory = 0x01,
20644def070435a2b5d67f0534f7a3a85a7389d60f2Chris Lattner      CI_AllowsRegister = 0x02,
20744def070435a2b5d67f0534f7a3a85a7389d60f2Chris Lattner      CI_ReadWrite = 0x04   // "+r" output constraint (read and write).
20844def070435a2b5d67f0534f7a3a85a7389d60f2Chris Lattner    };
20944def070435a2b5d67f0534f7a3a85a7389d60f2Chris Lattner    unsigned Flags;
21044def070435a2b5d67f0534f7a3a85a7389d60f2Chris Lattner    int TiedOperand;
21144def070435a2b5d67f0534f7a3a85a7389d60f2Chris Lattner
2122819fa85651526d59ade4fdc9da2cadd7b132973Chris Lattner    std::string ConstraintStr;  // constraint: "=rm"
2132819fa85651526d59ade4fdc9da2cadd7b132973Chris Lattner    std::string Name;           // Operand name: [foo] with no []'s.
214432c86969eced2ce658b3f3f2aa7407c8864f21bChris Lattner  public:
2152819fa85651526d59ade4fdc9da2cadd7b132973Chris Lattner    ConstraintInfo(const char *str, unsigned strlen, const std::string &name)
2162819fa85651526d59ade4fdc9da2cadd7b132973Chris Lattner      : Flags(0), TiedOperand(-1), ConstraintStr(str, str+strlen), Name(name) {}
2172819fa85651526d59ade4fdc9da2cadd7b132973Chris Lattner    explicit ConstraintInfo(const std::string &Str, const std::string &name)
2182819fa85651526d59ade4fdc9da2cadd7b132973Chris Lattner      : Flags(0), TiedOperand(-1), ConstraintStr(Str), Name(name) {}
219432c86969eced2ce658b3f3f2aa7407c8864f21bChris Lattner
220432c86969eced2ce658b3f3f2aa7407c8864f21bChris Lattner    const std::string &getConstraintStr() const { return ConstraintStr; }
2212819fa85651526d59ade4fdc9da2cadd7b132973Chris Lattner    const std::string &getName() const { return Name; }
22244def070435a2b5d67f0534f7a3a85a7389d60f2Chris Lattner    bool isReadWrite() const { return (Flags & CI_ReadWrite) != 0; }
22344def070435a2b5d67f0534f7a3a85a7389d60f2Chris Lattner    bool allowsRegister() const { return (Flags & CI_AllowsRegister) != 0; }
22444def070435a2b5d67f0534f7a3a85a7389d60f2Chris Lattner    bool allowsMemory() const { return (Flags & CI_AllowsMemory) != 0; }
22544def070435a2b5d67f0534f7a3a85a7389d60f2Chris Lattner    bool hasTiedOperand() const { return TiedOperand != -1; }
22644def070435a2b5d67f0534f7a3a85a7389d60f2Chris Lattner    unsigned getTiedOperand() const {
22744def070435a2b5d67f0534f7a3a85a7389d60f2Chris Lattner      assert(hasTiedOperand() && "Has no tied operand!");
22844def070435a2b5d67f0534f7a3a85a7389d60f2Chris Lattner      return (unsigned)TiedOperand;
22944def070435a2b5d67f0534f7a3a85a7389d60f2Chris Lattner    }
23044def070435a2b5d67f0534f7a3a85a7389d60f2Chris Lattner
23144def070435a2b5d67f0534f7a3a85a7389d60f2Chris Lattner    void setIsReadWrite() { Flags |= CI_ReadWrite; }
23244def070435a2b5d67f0534f7a3a85a7389d60f2Chris Lattner    void setAllowsMemory() { Flags |= CI_AllowsMemory; }
23344def070435a2b5d67f0534f7a3a85a7389d60f2Chris Lattner    void setAllowsRegister() { Flags |= CI_AllowsRegister; }
23444def070435a2b5d67f0534f7a3a85a7389d60f2Chris Lattner    void setTiedOperand(unsigned N) { TiedOperand = N; }
235d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  };
236d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson
237d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  // validateOutputConstraint, validateInputConstraint - Checks that
238d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  // a constraint is valid and provides information about it.
239d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  // FIXME: These should return a real error instead of just true/false.
240432c86969eced2ce658b3f3f2aa7407c8864f21bChris Lattner  bool validateOutputConstraint(ConstraintInfo &Info) const;
2412819fa85651526d59ade4fdc9da2cadd7b132973Chris Lattner  bool validateInputConstraint(ConstraintInfo *OutputConstraints,
2422819fa85651526d59ade4fdc9da2cadd7b132973Chris Lattner                               unsigned NumOutputs,
24345b050e72d058131e6f169fe54888bb91a003fb5Anders Carlsson                               ConstraintInfo &info) const;
24442e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson  bool resolveSymbolicName(const char *&Name,
2452819fa85651526d59ade4fdc9da2cadd7b132973Chris Lattner                           ConstraintInfo *OutputConstraints,
2462819fa85651526d59ade4fdc9da2cadd7b132973Chris Lattner                           unsigned NumOutputs, unsigned &Index) const;
24742e1ee0702d8267d632df0fdb5c479a582877c6fAnders Carlsson
2480eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner  virtual std::string convertConstraint(const char Constraint) const {
2490eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner    return std::string(1, Constraint);
2500eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner  }
251d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson
252d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  // Returns a string of target-specific clobbers, in LLVM format.
2530eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner  virtual const char *getClobbers() const = 0;
254d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson
2557a4718e813e5e99d478567a482217c7eef8572c5Devang Patel
25644fe49c9ccf29b8e9b66ce1f2375be6ec591c03cAnders Carlsson  /// getTargetPrefix - Return the target prefix used for identifying
25744fe49c9ccf29b8e9b66ce1f2375be6ec591c03cAnders Carlsson  /// llvm intrinsics.
2580eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner  virtual const char *getTargetPrefix() const = 0;
25944fe49c9ccf29b8e9b66ce1f2375be6ec591c03cAnders Carlsson
260ae3607684c5978dc2d877141015056c9d24f17eaTed Kremenek  /// getTargetTriple - Return the target triple of the primary target.
2619e9b6dc3fd413f5341fab54b681420eeb21cd169Chris Lattner  const char *getTargetTriple() const {
2620eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner    return Triple.c_str();
2630eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner  }
264ae3607684c5978dc2d877141015056c9d24f17eaTed Kremenek
265ae3607684c5978dc2d877141015056c9d24f17eaTed Kremenek  const char *getTargetDescription() const {
266364af81157a81cf34bb058a7d5b0185020e5164bSanjiv Gupta    return DescriptionString;
2677a4718e813e5e99d478567a482217c7eef8572c5Devang Patel  }
2683346ae6bba10da0d08c8d548134ddab4e13d040fAnders Carlsson
2693346ae6bba10da0d08c8d548134ddab4e13d040fAnders Carlsson  struct GCCRegAlias {
2703346ae6bba10da0d08c8d548134ddab4e13d040fAnders Carlsson    const char * const Aliases[5];
2713346ae6bba10da0d08c8d548134ddab4e13d040fAnders Carlsson    const char * const Register;
2723346ae6bba10da0d08c8d548134ddab4e13d040fAnders Carlsson  };
2732621fd1d6d3c5eadcae246859f62738645df7540Chris Lattner
274dcb4a1a6dd55fdf6c073d2761096f42e26be105aDaniel Dunbar  virtual bool useGlobalsForAutomaticVariables() const { return false; }
275dcb4a1a6dd55fdf6c073d2761096f42e26be105aDaniel Dunbar
2768e5c2b8072f4409c7c0004331d1db9652d5209c0Daniel Dunbar  /// getStringSymbolPrefix - Get the default symbol prefix to
2778e5c2b8072f4409c7c0004331d1db9652d5209c0Daniel Dunbar  /// use for string literals.
2788e5c2b8072f4409c7c0004331d1db9652d5209c0Daniel Dunbar  virtual const char *getStringSymbolPrefix(bool IsConstant) const {
2798e5c2b8072f4409c7c0004331d1db9652d5209c0Daniel Dunbar    return ".str";
2808e5c2b8072f4409c7c0004331d1db9652d5209c0Daniel Dunbar  }
2818e5c2b8072f4409c7c0004331d1db9652d5209c0Daniel Dunbar
2828e5c2b8072f4409c7c0004331d1db9652d5209c0Daniel Dunbar  /// getCFStringSymbolPrefix - Get the default symbol prefix
2838e5c2b8072f4409c7c0004331d1db9652d5209c0Daniel Dunbar  /// to use for CFString literals.
2848e5c2b8072f4409c7c0004331d1db9652d5209c0Daniel Dunbar  virtual const char *getCFStringSymbolPrefix() const {
2858e5c2b8072f4409c7c0004331d1db9652d5209c0Daniel Dunbar    return "";
2868e5c2b8072f4409c7c0004331d1db9652d5209c0Daniel Dunbar  }
2878e5c2b8072f4409c7c0004331d1db9652d5209c0Daniel Dunbar
288a9668e0b4c451a1021fe650c451b54dc98c2d18dDaniel Dunbar  /// getUnicodeStringSymbolPrefix - Get the default symbol prefix to
289a9668e0b4c451a1021fe650c451b54dc98c2d18dDaniel Dunbar  /// use for string literals.
290a9668e0b4c451a1021fe650c451b54dc98c2d18dDaniel Dunbar  virtual const char *getUnicodeStringSymbolPrefix() const {
291a9668e0b4c451a1021fe650c451b54dc98c2d18dDaniel Dunbar    return ".str";
292a9668e0b4c451a1021fe650c451b54dc98c2d18dDaniel Dunbar  }
293a9668e0b4c451a1021fe650c451b54dc98c2d18dDaniel Dunbar
2946d7d8398e71a8bd121d3b46e250f1dbcfb9679d4Daniel Dunbar  /// getUnicodeStringSection - Return the section to use for unicode
2956d7d8398e71a8bd121d3b46e250f1dbcfb9679d4Daniel Dunbar  /// string literals, or 0 if no special section is used.
296a9668e0b4c451a1021fe650c451b54dc98c2d18dDaniel Dunbar  virtual const char *getUnicodeStringSection() const {
297a9668e0b4c451a1021fe650c451b54dc98c2d18dDaniel Dunbar    return 0;
298a9668e0b4c451a1021fe650c451b54dc98c2d18dDaniel Dunbar  }
299a9668e0b4c451a1021fe650c451b54dc98c2d18dDaniel Dunbar
3006d7d8398e71a8bd121d3b46e250f1dbcfb9679d4Daniel Dunbar  /// getCFStringSection - Return the section to use for CFString
3018e5c2b8072f4409c7c0004331d1db9652d5209c0Daniel Dunbar  /// literals, or 0 if no special section is used.
3028e5c2b8072f4409c7c0004331d1db9652d5209c0Daniel Dunbar  virtual const char *getCFStringSection() const {
3038e5c2b8072f4409c7c0004331d1db9652d5209c0Daniel Dunbar    return "__DATA,__cfstring";
3048e5c2b8072f4409c7c0004331d1db9652d5209c0Daniel Dunbar  }
3058e5c2b8072f4409c7c0004331d1db9652d5209c0Daniel Dunbar
3068e5c2b8072f4409c7c0004331d1db9652d5209c0Daniel Dunbar  /// getCFStringDataSection - Return the section to use for the
3078e5c2b8072f4409c7c0004331d1db9652d5209c0Daniel Dunbar  /// constant string data associated with a CFString literal, or 0 if
3088e5c2b8072f4409c7c0004331d1db9652d5209c0Daniel Dunbar  /// no special section is used.
3098e5c2b8072f4409c7c0004331d1db9652d5209c0Daniel Dunbar  virtual const char *getCFStringDataSection() const {
3108e5c2b8072f4409c7c0004331d1db9652d5209c0Daniel Dunbar    return "__TEXT,__cstring,cstring_literals";
3118e5c2b8072f4409c7c0004331d1db9652d5209c0Daniel Dunbar  }
3128e5c2b8072f4409c7c0004331d1db9652d5209c0Daniel Dunbar
3138fc4dfb30e8bd94ca2ea7adb6cbece04fb96cd99Chris Lattner  /// getDefaultLangOptions - Allow the target to specify default settings for
3148fc4dfb30e8bd94ca2ea7adb6cbece04fb96cd99Chris Lattner  /// various language options.  These may be overridden by command line
3158fc4dfb30e8bd94ca2ea7adb6cbece04fb96cd99Chris Lattner  /// options.
3168fc4dfb30e8bd94ca2ea7adb6cbece04fb96cd99Chris Lattner  virtual void getDefaultLangOptions(LangOptions &Opts) {}
317dcb4a1a6dd55fdf6c073d2761096f42e26be105aDaniel Dunbar
3186328cc316d7032517399da9230a197cd29f2664dChris Lattner  /// HandleTargetFeatures - Handle target-specific options like -mattr=+sse2
3196328cc316d7032517399da9230a197cd29f2664dChris Lattner  /// and friends.  An array of arguments is passed in: if they are all valid,
3206328cc316d7032517399da9230a197cd29f2664dChris Lattner  /// this should handle them and return -1.  If there is an error, the index of
3216328cc316d7032517399da9230a197cd29f2664dChris Lattner  /// the invalid argument should be returned along with an optional error
3226328cc316d7032517399da9230a197cd29f2664dChris Lattner  /// string.
3236328cc316d7032517399da9230a197cd29f2664dChris Lattner  ///
3246328cc316d7032517399da9230a197cd29f2664dChris Lattner  /// Note that the driver should have already consolidated all the
3256328cc316d7032517399da9230a197cd29f2664dChris Lattner  /// target-feature settings and passed them to us in the -mattr list.  The
3266328cc316d7032517399da9230a197cd29f2664dChris Lattner  /// -mattr list is treated by the code generator as a diff against the -mcpu
3276328cc316d7032517399da9230a197cd29f2664dChris Lattner  /// setting, but the driver should pass all enabled options as "+" settings.
3286328cc316d7032517399da9230a197cd29f2664dChris Lattner  /// This means that the target should only look at + settings.
3296328cc316d7032517399da9230a197cd29f2664dChris Lattner  virtual int HandleTargetFeatures(std::string *StrArray, unsigned NumStrs,
3306328cc316d7032517399da9230a197cd29f2664dChris Lattner                                   std::string &ErrorReason) {
33116167a6e3f7dfb7ed0babc5e0baab9fd140e959dChris Lattner    if (NumStrs == 0)
33216167a6e3f7dfb7ed0babc5e0baab9fd140e959dChris Lattner      return -1;
33316167a6e3f7dfb7ed0babc5e0baab9fd140e959dChris Lattner    return 0;
33416167a6e3f7dfb7ed0babc5e0baab9fd140e959dChris Lattner  }
335264a76cdf382c507f4d43e64c89f1503f003ac95Anton Korobeynikov
336264a76cdf382c507f4d43e64c89f1503f003ac95Anton Korobeynikov  // getRegParmMax - Returns maximal number of args passed in registers.
337264a76cdf382c507f4d43e64c89f1503f003ac95Anton Korobeynikov  unsigned getRegParmMax() const {
338264a76cdf382c507f4d43e64c89f1503f003ac95Anton Korobeynikov    return RegParmMax;
339264a76cdf382c507f4d43e64c89f1503f003ac95Anton Korobeynikov  }
340264a76cdf382c507f4d43e64c89f1503f003ac95Anton Korobeynikov
341b030f0272500c6c5602f587ac029ee0dc0e5a05cEli Friedman  // isTLSSupported - Whether the target supports thread-local storage
342b030f0272500c6c5602f587ac029ee0dc0e5a05cEli Friedman  unsigned isTLSSupported() const {
343b030f0272500c6c5602f587ac029ee0dc0e5a05cEli Friedman    return TLSSupported;
344b030f0272500c6c5602f587ac029ee0dc0e5a05cEli Friedman  }
345b030f0272500c6c5602f587ac029ee0dc0e5a05cEli Friedman
3460eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattnerprotected:
3470e5d4ef3155651af17a90fdc07d9f80b33935c0cChris Lattner  virtual uint64_t getPointerWidthV(unsigned AddrSpace) const {
3480e5d4ef3155651af17a90fdc07d9f80b33935c0cChris Lattner    return PointerWidth;
3490e5d4ef3155651af17a90fdc07d9f80b33935c0cChris Lattner  }
3500e5d4ef3155651af17a90fdc07d9f80b33935c0cChris Lattner  virtual uint64_t getPointerAlignV(unsigned AddrSpace) const {
3510e5d4ef3155651af17a90fdc07d9f80b33935c0cChris Lattner    return PointerAlign;
3520e5d4ef3155651af17a90fdc07d9f80b33935c0cChris Lattner  }
35331fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta  virtual enum IntType getPtrDiffTypeV(unsigned AddrSpace) const {
35431fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta    return PtrDiffType;
35531fc07df7f0fc89ebf83ca05a20b29de45a7598dSanjiv Gupta  }
3560eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner  virtual void getGCCRegNames(const char * const *&Names,
3570eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner                              unsigned &NumNames) const = 0;
3583346ae6bba10da0d08c8d548134ddab4e13d040fAnders Carlsson  virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
3593346ae6bba10da0d08c8d548134ddab4e13d040fAnders Carlsson                                unsigned &NumAliases) const = 0;
360066d2ea7521896efc05cce7aa46fdd3a7ba96c28Anders Carlsson  virtual bool validateAsmConstraint(const char *&Name,
361d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson                                     TargetInfo::ConstraintInfo &info) const= 0;
3625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
3635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}  // end namespace clang
3655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#endif
367