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