TargetInfo.h revision f72a44330b9d9a4b2d93e9b91cfb8ab7bd4a0643
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
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;
277a9d49fd2bfac00e905b361ba76d26ab5b6c3b09Ted Kremenek
285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencernamespace Builtin { struct Info; }
295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
3042e6737f2efb113563140ad794c21c7709250402Chris Lattner/// TargetInfo - This class exposes information about the current target.
315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer///
325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencerclass TargetInfo {
330eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner  std::string Triple;
340eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattnerprotected:
355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// These are all caches for target values.
36d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner  unsigned WCharWidth, WCharAlign;
37bbced580c92afa09cd4423a9bdc90ff61cb1e79aTed Kremenek
38bbced580c92afa09cd4423a9bdc90ff61cb1e79aTed Kremenek  //==----------------------------------------------------------------==/
39bbced580c92afa09cd4423a9bdc90ff61cb1e79aTed Kremenek  //                  TargetInfo Construction.
40bbced580c92afa09cd4423a9bdc90ff61cb1e79aTed Kremenek  //==----------------------------------------------------------------==/
410eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner  TargetInfo(const std::string &T) : Triple(T) {
420eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner    // Set defaults.
430eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner    WCharWidth = WCharAlign = 32;
440eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner  }
45390161183919169c493916efac4c1e1b3828fea6Chris Lattner
46bbced580c92afa09cd4423a9bdc90ff61cb1e79aTed Kremenekpublic:
4742e6737f2efb113563140ad794c21c7709250402Chris Lattner  /// CreateTargetInfo - Return the target info object for the specified target
4842e6737f2efb113563140ad794c21c7709250402Chris Lattner  /// triple.
4942e6737f2efb113563140ad794c21c7709250402Chris Lattner  static TargetInfo* CreateTargetInfo(const std::string &Triple);
50bbced580c92afa09cd4423a9bdc90ff61cb1e79aTed Kremenek
510eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner  virtual ~TargetInfo();
52fb79f7cc00f9c1e04f11ed636eefb36d246b0fb8Ted Kremenek
535f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  ///===---- Target property query methods --------------------------------===//
545f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
555f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// getTargetDefines - Appends the target-specific #define values for this
565f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// target set to the specified buffer.
570eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner  virtual void getTargetDefines(std::vector<char> &DefineBuffer) const = 0;
585f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
595f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// isCharSigned - Return true if 'char' is 'signed char' or false if it is
605f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// treated as 'unsigned char'.  This is implementation defined according to
615f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// C99 6.2.5p15.  In our implementation, this is target-specific.
620eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner  bool isCharSigned() const {
635f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // FIXME: implement correctly.
645f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return true;
655f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
665f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
67f72a44330b9d9a4b2d93e9b91cfb8ab7bd4a0643Chris Lattner  /// getPointerWidth - Return the width of pointers on this target, for the
68f72a44330b9d9a4b2d93e9b91cfb8ab7bd4a0643Chris Lattner  /// specified address space. FIXME: implement correctly.
69f72a44330b9d9a4b2d93e9b91cfb8ab7bd4a0643Chris Lattner  uint64_t getPointerWidth(unsigned AddrSpace) const { return 32; }
70f72a44330b9d9a4b2d93e9b91cfb8ab7bd4a0643Chris Lattner  uint64_t getPointerAlign(unsigned AddrSpace) const { return 32; }
715f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
72d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner  /// getBoolInfo - Return the size of '_Bool' and C++ 'bool' for this target,
735f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// in bits.
740eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner  void getBoolInfo(uint64_t &Size, unsigned &Align) const {
75d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner    Size = Align = 8;    // FIXME: implement correctly: wrong for ppc32.
765f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
775f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
78d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner  /// getCharInfo - Return the size of 'char', 'signed char' and
795f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// 'unsigned char' for this target, in bits.
800eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner  void getCharInfo(uint64_t &Size, unsigned &Align) const {
81d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner    Size = Align = 8; // FIXME: implement correctly.
825f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
835f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
84d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner  /// getShortInfo - Return the size of 'signed short' and 'unsigned short' for
855f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// this target, in bits.
860eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner  void getShortInfo(uint64_t &Size, unsigned &Align) const {
87d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner    Size = Align = 16; // FIXME: implement correctly.
885f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
895f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
90d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner  /// getIntInfo - Return the size of 'signed int' and 'unsigned int' for this
915f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// target, in bits.
920eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner  void getIntInfo(uint64_t &Size, unsigned &Align) const {
93d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner    Size = Align = 32; // FIXME: implement correctly.
945f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
955f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
96d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner  /// getLongInfo - Return the size of 'signed long' and 'unsigned long' for
975f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// this target, in bits.
980eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner  void getLongInfo(uint64_t &Size, unsigned &Align) const {
99d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner    Size = Align = 32;  // FIXME: implement correctly: wrong for ppc64/x86-64
1005f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1015f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
102d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner  /// getLongLongInfo - Return the size of 'signed long long' and
1035f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// 'unsigned long long' for this target, in bits.
1040eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner  void getLongLongInfo(uint64_t &Size, unsigned &Align) const {
105d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner    Size = Align = 64; // FIXME: implement correctly.
1065f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1075f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
108525a05093a4816af961fe2bc6b8a81c17e2e26c2Chris Lattner  /// getFloatInfo - Characterize 'float' for this target.
109525a05093a4816af961fe2bc6b8a81c17e2e26c2Chris Lattner  void getFloatInfo(uint64_t &Size, unsigned &Align,
1100eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner                    const llvm::fltSemantics *&Format) const;
111692233e90a99c3a81dd04879d36eb9688f137c44Chris Lattner
112525a05093a4816af961fe2bc6b8a81c17e2e26c2Chris Lattner  /// getDoubleInfo - Characterize 'double' for this target.
113525a05093a4816af961fe2bc6b8a81c17e2e26c2Chris Lattner  void getDoubleInfo(uint64_t &Size, unsigned &Align,
1140eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner                     const llvm::fltSemantics *&Format) const;
115692233e90a99c3a81dd04879d36eb9688f137c44Chris Lattner
116525a05093a4816af961fe2bc6b8a81c17e2e26c2Chris Lattner  /// getLongDoubleInfo - Characterize 'long double' for this target.
117d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner  void getLongDoubleInfo(uint64_t &Size, unsigned &Align,
1180eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner                         const llvm::fltSemantics *&Format) const;
119692233e90a99c3a81dd04879d36eb9688f137c44Chris Lattner
120f72a44330b9d9a4b2d93e9b91cfb8ab7bd4a0643Chris Lattner  unsigned getWCharWidth() const { return WCharWidth; }
121f72a44330b9d9a4b2d93e9b91cfb8ab7bd4a0643Chris Lattner  unsigned getWCharAlign() const { return WCharAlign; }
122f72a44330b9d9a4b2d93e9b91cfb8ab7bd4a0643Chris Lattner
1235f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// getIntMaxTWidth - Return the size of intmax_t and uintmax_t for this
1245f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// target, in bits.
1250eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner  unsigned getIntMaxTWidth() const {
1265f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    // FIXME: implement correctly.
1275f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer    return 64;
1285f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  }
1295f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
1305f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// getTargetBuiltins - Return information about target-specific builtins for
1315f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// the current primary target, and info about which builtins are non-portable
1325f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer  /// across the current set of primary and secondary targets.
1330eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner  virtual void getTargetBuiltins(const Builtin::Info *&Records,
1340eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner                                 unsigned &NumRecords) const = 0;
1355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
136d19144b244f86227fcc2b0da794929fe83968dd5Chris Lattner  /// getVAListDeclaration - Return the declaration to use for
137d19144b244f86227fcc2b0da794929fe83968dd5Chris Lattner  /// __builtin_va_list, which is target-specific.
1380eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner  virtual const char *getVAListDeclaration() const = 0;
139fb5e5ba3c7708f3aef4db0ed30e8470b3ed4206aAnders Carlsson
1403346ae6bba10da0d08c8d548134ddab4e13d040fAnders Carlsson  /// isValidGCCRegisterName - Returns whether the passed in string
1413346ae6bba10da0d08c8d548134ddab4e13d040fAnders Carlsson  /// is a valid register name according to GCC. This is used by Sema for
1423346ae6bba10da0d08c8d548134ddab4e13d040fAnders Carlsson  /// inline asm statements.
1433346ae6bba10da0d08c8d548134ddab4e13d040fAnders Carlsson  bool isValidGCCRegisterName(const char *Name) const;
144d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson
145d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  // getNormalizedGCCRegisterName - Returns the "normalized" GCC register name.
146d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  // For example, on x86 it will return "ax" when "eax" is passed in.
147d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  const char *getNormalizedGCCRegisterName(const char *Name) const;
148d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson
149d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  enum ConstraintInfo {
150d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson    CI_None = 0x00,
151d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson    CI_AllowsMemory = 0x01,
152d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson    CI_AllowsRegister = 0x02,
153ef09d2b70a3b6f04c5d31c4c2bab2b7849f22561Anders Carlsson    CI_ReadWrite = 0x04
154d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  };
155d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson
156d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  // validateOutputConstraint, validateInputConstraint - Checks that
157d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  // a constraint is valid and provides information about it.
158d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  // FIXME: These should return a real error instead of just true/false.
159d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  bool validateOutputConstraint(const char *Name, ConstraintInfo &Info) const;
160d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  bool validateInputConstraint (const char *Name, unsigned NumOutputs,
161d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson                                ConstraintInfo &info) const;
162a5694b8b0096215137bf1c273764ec93ac4898fdLauro Ramos Venancio
1630eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner  virtual std::string convertConstraint(const char Constraint) const {
1640eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner    return std::string(1, Constraint);
1650eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner  }
166d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson
167d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  // Returns a string of target-specific clobbers, in LLVM format.
1680eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner  virtual const char *getClobbers() const = 0;
169d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson
170d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner  ///===---- Some helper methods ------------------------------------------===//
171d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner
1720eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner  unsigned getBoolWidth() const {
17319009e6fe7e0f51d2e49f4c94928a048c11c5281Chris Lattner    uint64_t Size; unsigned Align;
17498be4943e8dc4f3905629a7102668960873cf863Chris Lattner    getBoolInfo(Size, Align);
17519009e6fe7e0f51d2e49f4c94928a048c11c5281Chris Lattner    return static_cast<unsigned>(Size);
17619009e6fe7e0f51d2e49f4c94928a048c11c5281Chris Lattner  }
17719009e6fe7e0f51d2e49f4c94928a048c11c5281Chris Lattner
1780eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner  unsigned getCharWidth(bool isWide = false) const {
17998be4943e8dc4f3905629a7102668960873cf863Chris Lattner    if (isWide)
180f72a44330b9d9a4b2d93e9b91cfb8ab7bd4a0643Chris Lattner      return WCharWidth;
181d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner    uint64_t Size; unsigned Align;
182f72a44330b9d9a4b2d93e9b91cfb8ab7bd4a0643Chris Lattner    getCharInfo(Size, Align);
1831ff4f0cc794561e9a71f984551894be0f8660eadHartmut Kaiser    return static_cast<unsigned>(Size);
184d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner  }
185d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner
186f72a44330b9d9a4b2d93e9b91cfb8ab7bd4a0643Chris Lattner
1870eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner  unsigned getIntWidth() const {
188d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner    uint64_t Size; unsigned Align;
18998be4943e8dc4f3905629a7102668960873cf863Chris Lattner    getIntInfo(Size, Align);
1901ff4f0cc794561e9a71f984551894be0f8660eadHartmut Kaiser    return static_cast<unsigned>(Size);
191d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner  }
192d2d2a11a91d7ddf468bfb70f66362d24806ed601Chris Lattner
1930eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner  unsigned getLongWidth() const {
194ac60968d4541aa4e80fa71f64c36adfe5aa586e4Chris Lattner    uint64_t Size; unsigned Align;
19598be4943e8dc4f3905629a7102668960873cf863Chris Lattner    getLongInfo(Size, Align);
1961ff4f0cc794561e9a71f984551894be0f8660eadHartmut Kaiser    return static_cast<unsigned>(Size);
197ac60968d4541aa4e80fa71f64c36adfe5aa586e4Chris Lattner  }
198ac60968d4541aa4e80fa71f64c36adfe5aa586e4Chris Lattner
1990eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner  unsigned getLongLongWidth() const {
200ac60968d4541aa4e80fa71f64c36adfe5aa586e4Chris Lattner    uint64_t Size; unsigned Align;
20198be4943e8dc4f3905629a7102668960873cf863Chris Lattner    getLongLongInfo(Size, Align);
2021ff4f0cc794561e9a71f984551894be0f8660eadHartmut Kaiser    return static_cast<unsigned>(Size);
203ac60968d4541aa4e80fa71f64c36adfe5aa586e4Chris Lattner  }
2047a4718e813e5e99d478567a482217c7eef8572c5Devang Patel
20544fe49c9ccf29b8e9b66ce1f2375be6ec591c03cAnders Carlsson  /// getTargetPrefix - Return the target prefix used for identifying
20644fe49c9ccf29b8e9b66ce1f2375be6ec591c03cAnders Carlsson  /// llvm intrinsics.
2070eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner  virtual const char *getTargetPrefix() const = 0;
20844fe49c9ccf29b8e9b66ce1f2375be6ec591c03cAnders Carlsson
209ae3607684c5978dc2d877141015056c9d24f17eaTed Kremenek  /// getTargetTriple - Return the target triple of the primary target.
2100eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner  virtual const char *getTargetTriple() const {
2110eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner    return Triple.c_str();
2120eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner  }
213ae3607684c5978dc2d877141015056c9d24f17eaTed Kremenek
214ae3607684c5978dc2d877141015056c9d24f17eaTed Kremenek  const char *getTargetDescription() const {
2157a4718e813e5e99d478567a482217c7eef8572c5Devang Patel    // FIXME !
2167a4718e813e5e99d478567a482217c7eef8572c5Devang Patel    // Hard code darwin-x86 for now.
2177a4718e813e5e99d478567a482217c7eef8572c5Devang Patel    return "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:\
2187a4718e813e5e99d478567a482217c7eef8572c5Devang Patel32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128";
2197a4718e813e5e99d478567a482217c7eef8572c5Devang Patel  }
2203346ae6bba10da0d08c8d548134ddab4e13d040fAnders Carlsson
2213346ae6bba10da0d08c8d548134ddab4e13d040fAnders Carlsson  struct GCCRegAlias {
2223346ae6bba10da0d08c8d548134ddab4e13d040fAnders Carlsson    const char * const Aliases[5];
2233346ae6bba10da0d08c8d548134ddab4e13d040fAnders Carlsson    const char * const Register;
2243346ae6bba10da0d08c8d548134ddab4e13d040fAnders Carlsson  };
2250eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner
2260eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattnerprotected:
2270eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner  virtual void getGCCRegNames(const char * const *&Names,
2280eaed12e634dfd14f44620f63b8d3276fed028ddChris Lattner                              unsigned &NumNames) const = 0;
2293346ae6bba10da0d08c8d548134ddab4e13d040fAnders Carlsson  virtual void getGCCRegAliases(const GCCRegAlias *&Aliases,
2303346ae6bba10da0d08c8d548134ddab4e13d040fAnders Carlsson                                unsigned &NumAliases) const = 0;
231d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson  virtual bool validateAsmConstraint(char c,
232d04c6e23f2e10eeb9936778d67f4a1c4a14cc4f6Anders Carlsson                                     TargetInfo::ConstraintInfo &info) const= 0;
2335f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer};
2345f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2355f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer}  // end namespace clang
2365f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer
2375f016e2cb5d11daeb237544de1c5d59f20fe1a6eReid Spencer#endif
238