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