TargetInfo.h revision 42e6737f2efb113563140ad794c21c7709250402
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//
105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//  This file defines the TargetInfo and TargetInfoImpl interfaces.
115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//
125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer//===----------------------------------------------------------------------===//
135f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
145f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#ifndef LLVM_CLANG_BASIC_TARGETINFO_H
155f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#define LLVM_CLANG_BASIC_TARGETINFO_H
165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include "clang/Basic/SourceLocation.h"
18b8128140956c6f8f0ab143818775a81f4b4aa477Chris Lattner#include "llvm/Support/DataTypes.h"
195f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include <vector>
205f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#include <string>
215f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
22525a05093a4816af961fe2bc6b8a81c17e2e26c2Chris Lattnernamespace llvm { struct fltSemantics; }
23525a05093a4816af961fe2bc6b8a81c17e2e26c2Chris Lattner
245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencernamespace clang {
255f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass TargetInfoImpl;
275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass Diagnostic;
287a9d49fd2bfac00e905b361ba76d26ab5b6c3b09Ted Kremenekclass SourceManager;
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 {
355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// Primary - This tracks the primary target in the target set.
365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ///
3742e6737f2efb113563140ad794c21c7709250402Chris Lattner  const TargetInfoImpl *Target;
385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// These are all caches for target values.
40d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner  unsigned WCharWidth, WCharAlign;
41bbced580c92afa09cd4423a9bdc90ff61cb1e79aTed Kremenek
42bbced580c92afa09cd4423a9bdc90ff61cb1e79aTed Kremenek  //==----------------------------------------------------------------==/
43bbced580c92afa09cd4423a9bdc90ff61cb1e79aTed Kremenek  //                  TargetInfo Construction.
44bbced580c92afa09cd4423a9bdc90ff61cb1e79aTed Kremenek  //==----------------------------------------------------------------==/
455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
4642e6737f2efb113563140ad794c21c7709250402Chris Lattner  TargetInfo(const TargetInfoImpl *TII) {
4742e6737f2efb113563140ad794c21c7709250402Chris Lattner    Target = TII;
485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
495f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // Initialize Cache values to uncomputed.
505f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    WCharWidth = 0;
515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
52bbced580c92afa09cd4423a9bdc90ff61cb1e79aTed Kremenek
53bbced580c92afa09cd4423a9bdc90ff61cb1e79aTed Kremenekpublic:
5442e6737f2efb113563140ad794c21c7709250402Chris Lattner  /// CreateTargetInfo - Return the target info object for the specified target
5542e6737f2efb113563140ad794c21c7709250402Chris Lattner  /// triple.
5642e6737f2efb113563140ad794c21c7709250402Chris Lattner  static TargetInfo* CreateTargetInfo(const std::string &Triple);
57bbced580c92afa09cd4423a9bdc90ff61cb1e79aTed Kremenek
58fb79f7cc00f9c1e04f11ed636eefb36d246b0fb8Ted Kremenek  ~TargetInfo();
59fb79f7cc00f9c1e04f11ed636eefb36d246b0fb8Ted Kremenek
605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ///===---- Target property query methods --------------------------------===//
615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
625f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// getTargetDefines - Appends the target-specific #define values for this
635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// target set to the specified buffer.
645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  void getTargetDefines(std::vector<char> &DefineBuffer);
655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// isCharSigned - Return true if 'char' is 'signed char' or false if it is
675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// treated as 'unsigned char'.  This is implementation defined according to
685f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// C99 6.2.5p15.  In our implementation, this is target-specific.
699c728dc4d8da89c73fcae74c9e72d7a83ffd7b6dTed Kremenek  bool isCharSigned(FullSourceLoc Loc) {
705f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // FIXME: implement correctly.
715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return true;
725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
745f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// getPointerWidth - Return the width of pointers on this target, we
755f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// currently assume one pointer type.
769c728dc4d8da89c73fcae74c9e72d7a83ffd7b6dTed Kremenek  void getPointerInfo(uint64_t &Size, unsigned &Align, FullSourceLoc Loc) {
77d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner    Size = 32;  // FIXME: implement correctly.
78d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner    Align = 32;
795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
81d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner  /// getBoolInfo - Return the size of '_Bool' and C++ 'bool' for this target,
825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// in bits.
839c728dc4d8da89c73fcae74c9e72d7a83ffd7b6dTed Kremenek  void getBoolInfo(uint64_t &Size, unsigned &Align, FullSourceLoc Loc) {
84d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner    Size = Align = 8;    // FIXME: implement correctly: wrong for ppc32.
855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
865f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
87d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner  /// getCharInfo - Return the size of 'char', 'signed char' and
885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// 'unsigned char' for this target, in bits.
899c728dc4d8da89c73fcae74c9e72d7a83ffd7b6dTed Kremenek  void getCharInfo(uint64_t &Size, unsigned &Align, FullSourceLoc Loc) {
90d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner    Size = Align = 8; // FIXME: implement correctly.
915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
925f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
93d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner  /// getShortInfo - Return the size of 'signed short' and 'unsigned short' for
945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// this target, in bits.
959c728dc4d8da89c73fcae74c9e72d7a83ffd7b6dTed Kremenek  void getShortInfo(uint64_t &Size, unsigned &Align, FullSourceLoc Loc) {
96d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner    Size = Align = 16; // FIXME: implement correctly.
975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
985f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
99d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner  /// getIntInfo - Return the size of 'signed int' and 'unsigned int' for this
1005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// target, in bits.
1019c728dc4d8da89c73fcae74c9e72d7a83ffd7b6dTed Kremenek  void getIntInfo(uint64_t &Size, unsigned &Align, FullSourceLoc Loc) {
102d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner    Size = Align = 32; // FIXME: implement correctly.
1035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1045f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
105d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner  /// getLongInfo - Return the size of 'signed long' and 'unsigned long' for
1065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// this target, in bits.
1079c728dc4d8da89c73fcae74c9e72d7a83ffd7b6dTed Kremenek  void getLongInfo(uint64_t &Size, unsigned &Align, FullSourceLoc Loc) {
108d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner    Size = Align = 32;  // FIXME: implement correctly: wrong for ppc64/x86-64
1095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
111d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner  /// getLongLongInfo - Return the size of 'signed long long' and
1125f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// 'unsigned long long' for this target, in bits.
113d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner  void getLongLongInfo(uint64_t &Size, unsigned &Align,
1149c728dc4d8da89c73fcae74c9e72d7a83ffd7b6dTed Kremenek                            FullSourceLoc Loc) {
115d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner    Size = Align = 64; // FIXME: implement correctly.
1165f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1175f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
118525a05093a4816af961fe2bc6b8a81c17e2e26c2Chris Lattner  /// getFloatInfo - Characterize 'float' for this target.
119525a05093a4816af961fe2bc6b8a81c17e2e26c2Chris Lattner  void getFloatInfo(uint64_t &Size, unsigned &Align,
1209c728dc4d8da89c73fcae74c9e72d7a83ffd7b6dTed Kremenek                    const llvm::fltSemantics *&Format, FullSourceLoc Loc);
121692233e90a99c3a81dd04879d36eb9688f137c44Chris Lattner
122525a05093a4816af961fe2bc6b8a81c17e2e26c2Chris Lattner  /// getDoubleInfo - Characterize 'double' for this target.
123525a05093a4816af961fe2bc6b8a81c17e2e26c2Chris Lattner  void getDoubleInfo(uint64_t &Size, unsigned &Align,
1249c728dc4d8da89c73fcae74c9e72d7a83ffd7b6dTed Kremenek                     const llvm::fltSemantics *&Format,  FullSourceLoc Loc);
125692233e90a99c3a81dd04879d36eb9688f137c44Chris Lattner
126525a05093a4816af961fe2bc6b8a81c17e2e26c2Chris Lattner  /// getLongDoubleInfo - Characterize 'long double' for this target.
127d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner  void getLongDoubleInfo(uint64_t &Size, unsigned &Align,
1289c728dc4d8da89c73fcae74c9e72d7a83ffd7b6dTed Kremenek                         const llvm::fltSemantics *&Format, FullSourceLoc Loc);
129692233e90a99c3a81dd04879d36eb9688f137c44Chris Lattner
130d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner  /// getWCharInfo - Return the size of wchar_t in bits.
1315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ///
1329c728dc4d8da89c73fcae74c9e72d7a83ffd7b6dTed Kremenek  void getWCharInfo(uint64_t &Size, unsigned &Align,
1339c728dc4d8da89c73fcae74c9e72d7a83ffd7b6dTed Kremenek                    FullSourceLoc Loc) {
134d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner    if (!WCharWidth) ComputeWCharInfo(Loc);
135d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner    Size = WCharWidth;
136d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner    Align = WCharAlign;
1375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// getIntMaxTWidth - Return the size of intmax_t and uintmax_t for this
1405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// target, in bits.
1419c728dc4d8da89c73fcae74c9e72d7a83ffd7b6dTed Kremenek  unsigned getIntMaxTWidth(FullSourceLoc Loc) {
1425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // FIXME: implement correctly.
1435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return 64;
1445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// getTargetBuiltins - Return information about target-specific builtins for
1475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// the current primary target, and info about which builtins are non-portable
1485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// across the current set of primary and secondary targets.
14942e6737f2efb113563140ad794c21c7709250402Chris Lattner  void getTargetBuiltins(const Builtin::Info *&Records,
15042e6737f2efb113563140ad794c21c7709250402Chris Lattner                         unsigned &NumRecords) const;
1515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
152d19144b244f86227fcc2b0da794929fe83968dd5Chris Lattner  /// getVAListDeclaration - Return the declaration to use for
153d19144b244f86227fcc2b0da794929fe83968dd5Chris Lattner  /// __builtin_va_list, which is target-specific.
154fb5e5ba3c7708f3aef4db0ed30e8470b3ed4206aAnders Carlsson  const char *getVAListDeclaration() const;
155fb5e5ba3c7708f3aef4db0ed30e8470b3ed4206aAnders Carlsson
1563346ae6bba10da0d08c8d548134ddab4e13d040fAnders Carlsson  /// isValidGCCRegisterName - Returns whether the passed in string
1573346ae6bba10da0d08c8d548134ddab4e13d040fAnders Carlsson  /// is a valid register name according to GCC. This is used by Sema for
1583346ae6bba10da0d08c8d548134ddab4e13d040fAnders Carlsson  /// inline asm statements.
1593346ae6bba10da0d08c8d548134ddab4e13d040fAnders Carlsson  bool isValidGCCRegisterName(const char *Name) const;
160d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson
161d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  // getNormalizedGCCRegisterName - Returns the "normalized" GCC register name.
162d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  // For example, on x86 it will return "ax" when "eax" is passed in.
163d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  const char *getNormalizedGCCRegisterName(const char *Name) const;
164d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson
165d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  enum ConstraintInfo {
166d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson    CI_None = 0x00,
167d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson    CI_AllowsMemory = 0x01,
168d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson    CI_AllowsRegister = 0x02,
169ef09d2b70a3b6f04c5d31c4c2bab2b7849f22561Anders Carlsson    CI_ReadWrite = 0x04
170d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  };
171d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson
172d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  // validateOutputConstraint, validateInputConstraint - Checks that
173d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  // a constraint is valid and provides information about it.
174d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  // FIXME: These should return a real error instead of just true/false.
175d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  bool validateOutputConstraint(const char *Name, ConstraintInfo &Info) const;
176d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  bool validateInputConstraint (const char *Name, unsigned NumOutputs,
177d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson                                ConstraintInfo &info) const;
178a5694b8b0096215137bf1c273764ec93ac4898fdLauro Ramos Venancio
179a5694b8b0096215137bf1c273764ec93ac4898fdLauro Ramos Venancio  std::string convertConstraint(const char Constraint) const;
180d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson
181d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  // Returns a string of target-specific clobbers, in LLVM format.
182d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  const char *getClobbers() const;
183d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson
184d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner  ///===---- Some helper methods ------------------------------------------===//
185d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner
18619009e6fe7e0f51d2e49f4c94928a048c11c5281Chris Lattner  unsigned getBoolWidth(FullSourceLoc Loc) {
18719009e6fe7e0f51d2e49f4c94928a048c11c5281Chris Lattner    uint64_t Size; unsigned Align;
18819009e6fe7e0f51d2e49f4c94928a048c11c5281Chris Lattner    getBoolInfo(Size, Align, Loc);
18919009e6fe7e0f51d2e49f4c94928a048c11c5281Chris Lattner    return static_cast<unsigned>(Size);
19019009e6fe7e0f51d2e49f4c94928a048c11c5281Chris Lattner  }
19119009e6fe7e0f51d2e49f4c94928a048c11c5281Chris Lattner
1929c728dc4d8da89c73fcae74c9e72d7a83ffd7b6dTed Kremenek  unsigned getCharWidth(FullSourceLoc Loc) {
193d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner    uint64_t Size; unsigned Align;
194d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner    getCharInfo(Size, Align, Loc);
1951ff4f0cc794561e9a71f984551894be0f8660eadHartmut Kaiser    return static_cast<unsigned>(Size);
196d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner  }
197d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner
1989c728dc4d8da89c73fcae74c9e72d7a83ffd7b6dTed Kremenek  unsigned getWCharWidth(FullSourceLoc Loc) {
199d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner    uint64_t Size; unsigned Align;
200d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner    getWCharInfo(Size, Align, Loc);
2011ff4f0cc794561e9a71f984551894be0f8660eadHartmut Kaiser    return static_cast<unsigned>(Size);
202d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner  }
203d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner
2049c728dc4d8da89c73fcae74c9e72d7a83ffd7b6dTed Kremenek  unsigned getIntWidth(FullSourceLoc Loc) {
205d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner    uint64_t Size; unsigned Align;
206d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner    getIntInfo(Size, Align, Loc);
2071ff4f0cc794561e9a71f984551894be0f8660eadHartmut Kaiser    return static_cast<unsigned>(Size);
208d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner  }
209d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner
2109c728dc4d8da89c73fcae74c9e72d7a83ffd7b6dTed Kremenek  unsigned getLongWidth(FullSourceLoc Loc) {
211ac60968d4541aa4e80fa71f64c36adfe5aa586e4Chris Lattner    uint64_t Size; unsigned Align;
212ac60968d4541aa4e80fa71f64c36adfe5aa586e4Chris Lattner    getLongInfo(Size, Align, Loc);
2131ff4f0cc794561e9a71f984551894be0f8660eadHartmut Kaiser    return static_cast<unsigned>(Size);
214ac60968d4541aa4e80fa71f64c36adfe5aa586e4Chris Lattner  }
215ac60968d4541aa4e80fa71f64c36adfe5aa586e4Chris Lattner
2169c728dc4d8da89c73fcae74c9e72d7a83ffd7b6dTed Kremenek  unsigned getLongLongWidth(FullSourceLoc Loc) {
217ac60968d4541aa4e80fa71f64c36adfe5aa586e4Chris Lattner    uint64_t Size; unsigned Align;
218ac60968d4541aa4e80fa71f64c36adfe5aa586e4Chris Lattner    getLongLongInfo(Size, Align, Loc);
2191ff4f0cc794561e9a71f984551894be0f8660eadHartmut Kaiser    return static_cast<unsigned>(Size);
220ac60968d4541aa4e80fa71f64c36adfe5aa586e4Chris Lattner  }
2217a4718e813e5e99d478567a482217c7eef8572c5Devang Patel
22244fe49c9ccf29b8e9b66ce1f2375be6ec591c03cAnders Carlsson  /// getTargetPrefix - Return the target prefix used for identifying
22344fe49c9ccf29b8e9b66ce1f2375be6ec591c03cAnders Carlsson  /// llvm intrinsics.
22444fe49c9ccf29b8e9b66ce1f2375be6ec591c03cAnders Carlsson  const char *getTargetPrefix() const;
22544fe49c9ccf29b8e9b66ce1f2375be6ec591c03cAnders Carlsson
226ae3607684c5978dc2d877141015056c9d24f17eaTed Kremenek  /// getTargetTriple - Return the target triple of the primary target.
227ae3607684c5978dc2d877141015056c9d24f17eaTed Kremenek  const char *getTargetTriple() const;
228ae3607684c5978dc2d877141015056c9d24f17eaTed Kremenek
229ae3607684c5978dc2d877141015056c9d24f17eaTed Kremenek  const char *getTargetDescription() const {
2307a4718e813e5e99d478567a482217c7eef8572c5Devang Patel    // FIXME !
2317a4718e813e5e99d478567a482217c7eef8572c5Devang Patel    // Hard code darwin-x86 for now.
2327a4718e813e5e99d478567a482217c7eef8572c5Devang Patel    return "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:\
2337a4718e813e5e99d478567a482217c7eef8572c5Devang Patel32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128";
2347a4718e813e5e99d478567a482217c7eef8572c5Devang Patel  }
2355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerprivate:
2369c728dc4d8da89c73fcae74c9e72d7a83ffd7b6dTed Kremenek  void ComputeWCharInfo(FullSourceLoc Loc);
2375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
2385f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2395f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2405f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2415f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2425f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// TargetInfoImpl - This class is implemented for specific targets and is used
2435f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// by the TargetInfo class.  Target implementations should initialize instance
2445f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// variables and implement various virtual methods if the default values are
2455f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer/// not appropriate for the target.
2465f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass TargetInfoImpl {
2475f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerprotected:
2485f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  unsigned WCharWidth;    /// sizeof(wchar_t) in bits.  Default value is 32.
249d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner  unsigned WCharAlign;    /// alignof(wchar_t) in bits.  Default value is 32.
250ae3607684c5978dc2d877141015056c9d24f17eaTed Kremenek  std::string Triple;
2515f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerpublic:
252ae3607684c5978dc2d877141015056c9d24f17eaTed Kremenek  TargetInfoImpl(const std::string& triple)
253ae3607684c5978dc2d877141015056c9d24f17eaTed Kremenek    : WCharWidth(32), WCharAlign(32), Triple(triple) {}
254ae3607684c5978dc2d877141015056c9d24f17eaTed Kremenek
2555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  virtual ~TargetInfoImpl() {}
2565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
257ae3607684c5978dc2d877141015056c9d24f17eaTed Kremenek  /// getTargetTriple - Return the string representing the target triple this
258ae3607684c5978dc2d877141015056c9d24f17eaTed Kremenek  ///  TargetInfoImpl object was created from.
259ae3607684c5978dc2d877141015056c9d24f17eaTed Kremenek  const char* getTargetTriple() const { return Triple.c_str(); }
260ae3607684c5978dc2d877141015056c9d24f17eaTed Kremenek
26144fe49c9ccf29b8e9b66ce1f2375be6ec591c03cAnders Carlsson  virtual const char *getTargetPrefix() const = 0;
26244fe49c9ccf29b8e9b66ce1f2375be6ec591c03cAnders Carlsson
2635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// getTargetDefines - Return a list of the target-specific #define values set
264d15fa82aebca0c26160805497bd88a4e61ebe011Chris Lattner  /// when compiling to this target.  Each string should be of the form
265d15fa82aebca0c26160805497bd88a4e61ebe011Chris Lattner  /// "#define X Y\n".
266d15fa82aebca0c26160805497bd88a4e61ebe011Chris Lattner  virtual void getTargetDefines(std::vector<char> &Defines) const = 0;
2675f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
268fb5e5ba3c7708f3aef4db0ed30e8470b3ed4206aAnders Carlsson  /// getVAListDeclaration - Return the declaration to use for
269fb5e5ba3c7708f3aef4db0ed30e8470b3ed4206aAnders Carlsson  /// __builtin_va_list, which is target-specific.
270fb5e5ba3c7708f3aef4db0ed30e8470b3ed4206aAnders Carlsson  virtual const char *getVAListDeclaration() const = 0;
2713346ae6bba10da0d08c8d548134ddab4e13d040fAnders Carlsson
2725f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// getWCharWidth - Return the size of wchar_t in bits.
2735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ///
274d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner  void getWCharInfo(unsigned &Size, unsigned &Align) const {
275d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner    Size = WCharWidth;
276d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner    Align = WCharAlign;
277d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner  }
2783346ae6bba10da0d08c8d548134ddab4e13d040fAnders Carlsson
2795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// getTargetBuiltins - Return information about target-specific builtins for
2805f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// the target.
2815f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  virtual void getTargetBuiltins(const Builtin::Info *&Records,
2825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer                                 unsigned &NumRecords) const {
2835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    Records = 0;
2845f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    NumRecords = 0;
2855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
2863346ae6bba10da0d08c8d548134ddab4e13d040fAnders Carlsson
2873346ae6bba10da0d08c8d548134ddab4e13d040fAnders Carlsson  virtual void getGCCRegNames(const char * const *&Names,
2886fa9086043b0338d895a4cdb0ec8542530af90d7Anders Carlsson                              unsigned &NumNames) const = 0;
2893346ae6bba10da0d08c8d548134ddab4e13d040fAnders Carlsson
2903346ae6bba10da0d08c8d548134ddab4e13d040fAnders Carlsson  struct GCCRegAlias {
2913346ae6bba10da0d08c8d548134ddab4e13d040fAnders Carlsson    const char * const Aliases[5];
2923346ae6bba10da0d08c8d548134ddab4e13d040fAnders Carlsson    const char * const Register;
2933346ae6bba10da0d08c8d548134ddab4e13d040fAnders Carlsson  };
2943346ae6bba10da0d08c8d548134ddab4e13d040fAnders Carlsson  virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2953346ae6bba10da0d08c8d548134ddab4e13d040fAnders Carlsson                                unsigned &NumAliases) const = 0;
2963346ae6bba10da0d08c8d548134ddab4e13d040fAnders Carlsson
297d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  virtual bool validateAsmConstraint(char c,
298d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson                                     TargetInfo::ConstraintInfo &info) const= 0;
299a5694b8b0096215137bf1c273764ec93ac4898fdLauro Ramos Venancio
300a5694b8b0096215137bf1c273764ec93ac4898fdLauro Ramos Venancio  virtual std::string convertConstraint(const char Constraint) const {
301a5694b8b0096215137bf1c273764ec93ac4898fdLauro Ramos Venancio    return std::string(1, Constraint);
302a5694b8b0096215137bf1c273764ec93ac4898fdLauro Ramos Venancio  }
303d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson
304d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  virtual const char *getClobbers() const = 0;
3055f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerprivate:
3065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  virtual void ANCHOR(); // out-of-line virtual method for class.
3075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
3085f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3095f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}  // end namespace clang
3105f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3115f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#endif
312