CodeGenTarget.h revision 3aa39f439a0971a2502b2c728a8006becaf96601
1803a5f6ecb1823280f80e3c4459aa58627d0484cChris Lattner//===- CodeGenTarget.h - Target Class Wrapper -------------------*- C++ -*-===// 23da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman// 301d45827a1e512f3b19ba857772bf02baa3c0c4eJohn Criswell// The LLVM Compiler Infrastructure 401d45827a1e512f3b19ba857772bf02baa3c0c4eJohn Criswell// 501d45827a1e512f3b19ba857772bf02baa3c0c4eJohn Criswell// This file was developed by the LLVM research group and is distributed under 601d45827a1e512f3b19ba857772bf02baa3c0c4eJohn Criswell// the University of Illinois Open Source License. See LICENSE.TXT for details. 73da94aec4d429b2ba0f65fa040c33650cade196bMisha Brukman// 801d45827a1e512f3b19ba857772bf02baa3c0c4eJohn Criswell//===----------------------------------------------------------------------===// 945872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner// 10803a5f6ecb1823280f80e3c4459aa58627d0484cChris Lattner// This file defines wrappers for the Target class and related global 11803a5f6ecb1823280f80e3c4459aa58627d0484cChris Lattner// functionality. This makes it easier to access the data and provides a single 12803a5f6ecb1823280f80e3c4459aa58627d0484cChris Lattner// place that needs to check it for validity. All of these classes throw 13803a5f6ecb1823280f80e3c4459aa58627d0484cChris Lattner// exceptions on error conditions. 1445872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner// 1545872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner//===----------------------------------------------------------------------===// 1645872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner 17803a5f6ecb1823280f80e3c4459aa58627d0484cChris Lattner#ifndef CODEGEN_TARGET_H 18803a5f6ecb1823280f80e3c4459aa58627d0484cChris Lattner#define CODEGEN_TARGET_H 1945872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner 2026693113201f4c9d441678e50d96f38d3288798eChris Lattner#include "CodeGenRegisters.h" 21ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner#include "CodeGenInstruction.h" 2245872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner#include <iosfwd> 23ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner#include <map> 24d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 25d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm { 26d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 2745872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattnerclass Record; 2845872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattnerclass RecordKeeper; 291fca5ff62bb2ecb5bfc8974f4dbfc56e9d3ca721Chris Lattnerstruct CodeGenRegister; 3045872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner 3145872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner/// getValueType - Return the MVT::ValueType that the specified TableGen record 3245872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner/// corresponds to. 3345872079672a4fb500fdcb9c77b23e3e550c8f97Chris LattnerMVT::ValueType getValueType(Record *Rec); 3445872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner 3545872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattnerstd::ostream &operator<<(std::ostream &OS, MVT::ValueType T); 36d3464c19a8b6acecd8a9618489ec7612505fd4bdChris Lattnerstd::string getName(MVT::ValueType T); 37b72fb7ef75862269879ecaaf8e31c5d9a6bb56e5Chris Lattnerstd::string getEnumName(MVT::ValueType T); 3845872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner 3945872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner 4045872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner/// CodeGenTarget - This class corresponds to the Target class in the .td files. 4145872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner/// 4245872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattnerclass CodeGenTarget { 4345872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner Record *TargetRec; 4445872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner std::vector<Record*> CalleeSavedRegisters; 4545872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner MVT::ValueType PointerType; 4645872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner 47ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner mutable std::map<std::string, CodeGenInstruction> Instructions; 4826693113201f4c9d441678e50d96f38d3288798eChris Lattner mutable std::vector<CodeGenRegister> Registers; 49056afeface2ac98664ed8fa4799b46178a4a6fe3Chris Lattner mutable std::vector<CodeGenRegisterClass> RegisterClasses; 50e9f4ba8dd47de9da2a98db3bbe25b54d5a9607f1Chris Lattner mutable std::vector<MVT::ValueType> LegalValueTypes; 5126693113201f4c9d441678e50d96f38d3288798eChris Lattner void ReadRegisters() const; 52056afeface2ac98664ed8fa4799b46178a4a6fe3Chris Lattner void ReadRegisterClasses() const; 53056afeface2ac98664ed8fa4799b46178a4a6fe3Chris Lattner void ReadInstructions() const; 54e9f4ba8dd47de9da2a98db3bbe25b54d5a9607f1Chris Lattner void ReadLegalValueTypes() const; 5545872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattnerpublic: 5645872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner CodeGenTarget(); 5745872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner 5845872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner Record *getTargetRecord() const { return TargetRec; } 5945872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner const std::string &getName() const; 6045872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner 6145872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner const std::vector<Record*> &getCalleeSavedRegisters() const { 6245872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner return CalleeSavedRegisters; 6345872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner } 6445872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner 6554c66feed926f6cdaf544895f78b5bb1ead6f0eaChris Lattner MVT::ValueType getPointerType() const { return PointerType; } 6654c66feed926f6cdaf544895f78b5bb1ead6f0eaChris Lattner 67175580c0f36b026daf9de0adabdb7ddcf7619db6Chris Lattner /// getInstructionSet - Return the InstructionSet object. 68ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner /// 6945872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner Record *getInstructionSet() const; 7045872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner 71175580c0f36b026daf9de0adabdb7ddcf7619db6Chris Lattner /// getAsmWriter - Return the AssemblyWriter definition for this target. 72175580c0f36b026daf9de0adabdb7ddcf7619db6Chris Lattner /// 73175580c0f36b026daf9de0adabdb7ddcf7619db6Chris Lattner Record *getAsmWriter() const; 74175580c0f36b026daf9de0adabdb7ddcf7619db6Chris Lattner 75e9f4ba8dd47de9da2a98db3bbe25b54d5a9607f1Chris Lattner const std::vector<CodeGenRegister> &getRegisters() const { 7626693113201f4c9d441678e50d96f38d3288798eChris Lattner if (Registers.empty()) ReadRegisters(); 7726693113201f4c9d441678e50d96f38d3288798eChris Lattner return Registers; 7826693113201f4c9d441678e50d96f38d3288798eChris Lattner } 79ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner 80e9f4ba8dd47de9da2a98db3bbe25b54d5a9607f1Chris Lattner const std::vector<CodeGenRegisterClass> &getRegisterClasses() const { 81056afeface2ac98664ed8fa4799b46178a4a6fe3Chris Lattner if (RegisterClasses.empty()) ReadRegisterClasses(); 82056afeface2ac98664ed8fa4799b46178a4a6fe3Chris Lattner return RegisterClasses; 83056afeface2ac98664ed8fa4799b46178a4a6fe3Chris Lattner } 84ddb395463c08b39090bbee4ed22433f5990a6331Nate Begeman 85ddb395463c08b39090bbee4ed22433f5990a6331Nate Begeman const CodeGenRegisterClass &getRegisterClass(Record *R) const { 86ddb395463c08b39090bbee4ed22433f5990a6331Nate Begeman const std::vector<CodeGenRegisterClass> &RC = getRegisterClasses(); 87ddb395463c08b39090bbee4ed22433f5990a6331Nate Begeman for (unsigned i = 0, e = RC.size(); i != e; ++i) 88ddb395463c08b39090bbee4ed22433f5990a6331Nate Begeman if (RC[i].TheDef == R) 89ddb395463c08b39090bbee4ed22433f5990a6331Nate Begeman return RC[i]; 90ddb395463c08b39090bbee4ed22433f5990a6331Nate Begeman assert(0 && "Didn't find the register class"); 91ddb395463c08b39090bbee4ed22433f5990a6331Nate Begeman abort(); 92ddb395463c08b39090bbee4ed22433f5990a6331Nate Begeman } 935c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner 945c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner /// getRegisterClassForRegister - Find the register class that contains the 955c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner /// specified physical register. If there register exists in multiple 965c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner /// register classes or is not in a register class, return null. 975c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner const CodeGenRegisterClass *getRegisterClassForRegister(Record *R) const { 985c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner const std::vector<CodeGenRegisterClass> &RCs = getRegisterClasses(); 995c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner const CodeGenRegisterClass *FoundRC = 0; 1005c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner for (unsigned i = 0, e = RCs.size(); i != e; ++i) { 1015c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner const CodeGenRegisterClass &RC = RegisterClasses[i]; 1025c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner for (unsigned ei = 0, ee = RC.Elements.size(); ei != ee; ++ei) { 1035c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner if (R == RC.Elements[ei]) { 1045c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner if (FoundRC) return 0; // In multiple RC's 1055c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner FoundRC = &RC; 1065c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner break; 1075c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner } 1085c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner } 1095c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner } 1105c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner return FoundRC; 1115c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner } 1125c4736a3da04795ba8d04e152e151afd6942e2f1Chris Lattner 113e9f4ba8dd47de9da2a98db3bbe25b54d5a9607f1Chris Lattner const std::vector<MVT::ValueType> &getLegalValueTypes() const { 114e9f4ba8dd47de9da2a98db3bbe25b54d5a9607f1Chris Lattner if (LegalValueTypes.empty()) ReadLegalValueTypes(); 115e9f4ba8dd47de9da2a98db3bbe25b54d5a9607f1Chris Lattner return LegalValueTypes; 116e9f4ba8dd47de9da2a98db3bbe25b54d5a9607f1Chris Lattner } 117e9f4ba8dd47de9da2a98db3bbe25b54d5a9607f1Chris Lattner 118e9f4ba8dd47de9da2a98db3bbe25b54d5a9607f1Chris Lattner /// isLegalValueType - Return true if the specified value type is natively 119e9f4ba8dd47de9da2a98db3bbe25b54d5a9607f1Chris Lattner /// supported by the target (i.e. there are registers that directly hold it). 120e9f4ba8dd47de9da2a98db3bbe25b54d5a9607f1Chris Lattner bool isLegalValueType(MVT::ValueType VT) const { 121e9f4ba8dd47de9da2a98db3bbe25b54d5a9607f1Chris Lattner const std::vector<MVT::ValueType> &LegalVTs = getLegalValueTypes(); 122e9f4ba8dd47de9da2a98db3bbe25b54d5a9607f1Chris Lattner for (unsigned i = 0, e = LegalVTs.size(); i != e; ++i) 123e9f4ba8dd47de9da2a98db3bbe25b54d5a9607f1Chris Lattner if (LegalVTs[i] == VT) return true; 124e9f4ba8dd47de9da2a98db3bbe25b54d5a9607f1Chris Lattner return false; 125e9f4ba8dd47de9da2a98db3bbe25b54d5a9607f1Chris Lattner } 126056afeface2ac98664ed8fa4799b46178a4a6fe3Chris Lattner 127ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner /// getInstructions - Return all of the instructions defined for this target. 128ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner /// 129ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner const std::map<std::string, CodeGenInstruction> &getInstructions() const { 130ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner if (Instructions.empty()) ReadInstructions(); 131ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner return Instructions; 132ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner } 133ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner 134a974b20cae7691361f2be5b27fbc1658855ed96cChris Lattner CodeGenInstruction &getInstruction(const std::string &Name) const { 135a974b20cae7691361f2be5b27fbc1658855ed96cChris Lattner const std::map<std::string, CodeGenInstruction> &Insts = getInstructions(); 136a974b20cae7691361f2be5b27fbc1658855ed96cChris Lattner assert(Insts.count(Name) && "Not an instruction!"); 137a974b20cae7691361f2be5b27fbc1658855ed96cChris Lattner return const_cast<CodeGenInstruction&>(Insts.find(Name)->second); 138a974b20cae7691361f2be5b27fbc1658855ed96cChris Lattner } 139a974b20cae7691361f2be5b27fbc1658855ed96cChris Lattner 140ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner typedef std::map<std::string, 141ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner CodeGenInstruction>::const_iterator inst_iterator; 142ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner inst_iterator inst_begin() const { return getInstructions().begin(); } 143ec3524064c57fbc2c5976ca301bbaadc94006d07Chris Lattner inst_iterator inst_end() const { return Instructions.end(); } 14426693113201f4c9d441678e50d96f38d3288798eChris Lattner 145d6488671736d0a5aaee1218748b94d8c68f33716Chris Lattner /// getInstructionsByEnumValue - Return all of the instructions defined by the 146d6488671736d0a5aaee1218748b94d8c68f33716Chris Lattner /// target, ordered by their enum value. 147d6488671736d0a5aaee1218748b94d8c68f33716Chris Lattner void getInstructionsByEnumValue(std::vector<const CodeGenInstruction*> 148d6488671736d0a5aaee1218748b94d8c68f33716Chris Lattner &NumberedInstructions); 149d6488671736d0a5aaee1218748b94d8c68f33716Chris Lattner 150d6488671736d0a5aaee1218748b94d8c68f33716Chris Lattner 15126693113201f4c9d441678e50d96f38d3288798eChris Lattner /// getPHIInstruction - Return the designated PHI instruction. 15226693113201f4c9d441678e50d96f38d3288798eChris Lattner /// 15326693113201f4c9d441678e50d96f38d3288798eChris Lattner const CodeGenInstruction &getPHIInstruction() const; 15435e83cc970e2ed99c8087e0c6b99f8a3618c279bMisha Brukman 15535e83cc970e2ed99c8087e0c6b99f8a3618c279bMisha Brukman /// isLittleEndianEncoding - are instruction bit patterns defined as [0..n]? 15635e83cc970e2ed99c8087e0c6b99f8a3618c279bMisha Brukman /// 15735e83cc970e2ed99c8087e0c6b99f8a3618c279bMisha Brukman bool isLittleEndianEncoding() const; 15845872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner}; 15945872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner 1600fc71988900e600f3ef5b13d9682e2bbab92811dEvan Cheng/// ComplexPattern - ComplexPattern info, corresponding to the ComplexPattern 1610fc71988900e600f3ef5b13d9682e2bbab92811dEvan Cheng/// tablegen class in TargetSelectionDAG.td 1620fc71988900e600f3ef5b13d9682e2bbab92811dEvan Chengclass ComplexPattern { 1633aa39f439a0971a2502b2c728a8006becaf96601Evan Cheng MVT::ValueType Ty; 1640fc71988900e600f3ef5b13d9682e2bbab92811dEvan Cheng unsigned NumOperands; 1650fc71988900e600f3ef5b13d9682e2bbab92811dEvan Cheng std::string SelectFunc; 1663aa39f439a0971a2502b2c728a8006becaf96601Evan Cheng std::vector<Record*> RootNodes; 1670fc71988900e600f3ef5b13d9682e2bbab92811dEvan Chengpublic: 1680fc71988900e600f3ef5b13d9682e2bbab92811dEvan Cheng ComplexPattern() : NumOperands(0) {}; 1690fc71988900e600f3ef5b13d9682e2bbab92811dEvan Cheng ComplexPattern(Record *R); 1700fc71988900e600f3ef5b13d9682e2bbab92811dEvan Cheng 1713aa39f439a0971a2502b2c728a8006becaf96601Evan Cheng MVT::ValueType getValueType() const { return Ty; } 1720fc71988900e600f3ef5b13d9682e2bbab92811dEvan Cheng unsigned getNumOperands() const { return NumOperands; } 1730fc71988900e600f3ef5b13d9682e2bbab92811dEvan Cheng const std::string &getSelectFunc() const { return SelectFunc; } 1743aa39f439a0971a2502b2c728a8006becaf96601Evan Cheng const std::vector<Record*> &getRootNodes() const { 1753aa39f439a0971a2502b2c728a8006becaf96601Evan Cheng return RootNodes; 1760fc71988900e600f3ef5b13d9682e2bbab92811dEvan Cheng } 1770fc71988900e600f3ef5b13d9682e2bbab92811dEvan Cheng}; 1780fc71988900e600f3ef5b13d9682e2bbab92811dEvan Cheng 179d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace 180d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 18145872079672a4fb500fdcb9c77b23e3e550c8f97Chris Lattner#endif 182