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