15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- TargetRegistry.h ---------------------------------------------------===// 25460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// 35460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// The MCLinker Project 45460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// 55460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// This file is distributed under the University of Illinois Open Source 65460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// License. See LICENSE.TXT for details. 75460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// 85460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===// 9affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#ifndef MCLD_TARGET_REGISTRY_H 10affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#define MCLD_TARGET_REGISTRY_H 115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <llvm/Support/TargetRegistry.h> 125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <string> 135460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <list> 145460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaonamespace llvm { 165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass TargetMachine; 175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass MCCodeEmitter; 185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass MCContext; 195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass AsmPrinter; 205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} // namespace of llvm 215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaonamespace mcld { 2322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 2422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass Module; 2522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass LinkerConfig; 26f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesclass LinkerScript; 2722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass MemoryArea; 2822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass MCLDTargetMachine; 295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass TargetRegistry; 3022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liaoclass MCLinker; 315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass TargetLDBackend; 325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass AttributeFactory; 335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass InputFactory; 345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass ContextFactory; 35affc150dc44fab1911775a49636d0ce85333b634Zonr Changclass DiagnosticLineInfo; 365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===// 385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// Target - mcld::Target is an object adapter of llvm::Target 3922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao//===----------------------------------------------------------------------===// 405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass Target 415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 4222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao friend class mcld::MCLDTargetMachine; 435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao friend class mcld::TargetRegistry; 445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic: 4522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao typedef mcld::MCLDTargetMachine *(*TargetMachineCtorTy)(const mcld::Target &, 465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao llvm::TargetMachine &, 475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const std::string&); 485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 4922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao typedef MCLinker *(*MCLinkerCtorTy)(const std::string& pTriple, 5022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao LinkerConfig&, 5122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao Module&, 5222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao MemoryArea& pOutput); 5322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 54f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines typedef bool (*EmulationFnTy)(LinkerScript&, LinkerConfig&); 555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao typedef TargetLDBackend *(*TargetLDBackendCtorTy)(const llvm::Target&, 5722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const LinkerConfig&); 585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 5967e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao typedef DiagnosticLineInfo *(*DiagnosticLineInfoCtorTy)(const mcld::Target&, 60affc150dc44fab1911775a49636d0ce85333b634Zonr Chang const std::string&); 615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic: 635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Target(); 645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 65affc150dc44fab1911775a49636d0ce85333b634Zonr Chang void setTarget(const llvm::Target& pTarget) 66affc150dc44fab1911775a49636d0ce85333b634Zonr Chang { m_pT = &pTarget; } 675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 6822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao mcld::MCLDTargetMachine *createTargetMachine(const std::string &pTriple, 695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const std::string &pCPU, const std::string &pFeatures, 705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const llvm::TargetOptions &Options, 715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao llvm::Reloc::Model RM = llvm::Reloc::Default, 725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao llvm::CodeModel::Model CM = llvm::CodeModel::Default, 73affc150dc44fab1911775a49636d0ce85333b634Zonr Chang llvm::CodeGenOpt::Level OL = llvm::CodeGenOpt::Default) const 74affc150dc44fab1911775a49636d0ce85333b634Zonr Chang { 755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (TargetMachineCtorFn && m_pT) { 765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao llvm::TargetMachine *tm = m_pT->createTargetMachine(pTriple, pCPU, pFeatures, Options, RM, CM, OL); 775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (tm) 785460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return TargetMachineCtorFn(*this, *tm, pTriple); 795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 80affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return NULL; 815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 8322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// createMCLinker - create target-specific MCLinker 845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// 8522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// @return created MCLinker 8622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao MCLinker *createMCLinker(const std::string &pTriple, 8722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao LinkerConfig& pConfig, 8822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao Module& pModule, 8922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao MemoryArea& pOutput) const { 9022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (!MCLinkerCtorFn) 91affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return NULL; 9222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return MCLinkerCtorFn(pTriple, pConfig, pModule, pOutput); 9322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 9422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 9522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// emulate - given MCLinker default values for the other aspects of the 9622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// target system. 97f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines bool emulate(LinkerScript& pScript, LinkerConfig& pConfig) const { 9822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (!EmulationFn) 9922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return false; 100f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines return EmulationFn(pScript, pConfig); 1015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 1025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// createLDBackend - create target-specific LDBackend 1045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// 1055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// @return created TargetLDBackend 10622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao TargetLDBackend* createLDBackend(const LinkerConfig& pConfig) const 107affc150dc44fab1911775a49636d0ce85333b634Zonr Chang { 1085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (!TargetLDBackendCtorFn) 109affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return NULL; 11022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao return TargetLDBackendCtorFn(*get(), pConfig); 1115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 1125460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 113affc150dc44fab1911775a49636d0ce85333b634Zonr Chang /// createDiagnosticLineInfo - create target-specific DiagnosticLineInfo 11467e37f1be98c926645219cfb47fab9e90d8c725cShih-wei Liao DiagnosticLineInfo* createDiagnosticLineInfo(const mcld::Target& pTarget, 115affc150dc44fab1911775a49636d0ce85333b634Zonr Chang const std::string& pTriple) const 116affc150dc44fab1911775a49636d0ce85333b634Zonr Chang { 117affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (!DiagnosticLineInfoCtorFn) 118affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return NULL; 119affc150dc44fab1911775a49636d0ce85333b634Zonr Chang return DiagnosticLineInfoCtorFn(pTarget, pTriple); 1205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 1215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 12222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao const llvm::Target* get() const { return m_pT; } 123affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 1245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate: 125affc150dc44fab1911775a49636d0ce85333b634Zonr Chang // ----- function pointers ----- // 126affc150dc44fab1911775a49636d0ce85333b634Zonr Chang TargetMachineCtorTy TargetMachineCtorFn; 12722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao MCLinkerCtorTy MCLinkerCtorFn; 12822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao EmulationFnTy EmulationFn; 129affc150dc44fab1911775a49636d0ce85333b634Zonr Chang TargetLDBackendCtorTy TargetLDBackendCtorFn; 130affc150dc44fab1911775a49636d0ce85333b634Zonr Chang DiagnosticLineInfoCtorTy DiagnosticLineInfoCtorFn; 131affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 132affc150dc44fab1911775a49636d0ce85333b634Zonr Chang // ----- adapted llvm::Target ----- // 1335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const llvm::Target* m_pT; 1345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}; 1355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===// 1375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// TargetRegistry - mcld::TargetRegistry is an object adapter of 1385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// llvm::TargetRegistry 1395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// 1405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoclass TargetRegistry 1415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 1425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic: 1435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao typedef std::list<mcld::Target*> TargetListTy; 1445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao typedef TargetListTy::iterator iterator; 1455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate: 1475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao static TargetListTy s_TargetList; 1485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaopublic: 1505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao static iterator begin() { return s_TargetList.begin(); } 1515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao static iterator end() { return s_TargetList.end(); } 1525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao static size_t size() { return s_TargetList.size(); } 1545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao static bool empty() { return s_TargetList.empty(); } 1555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// RegisterTarget - Register the given target. Attempts to register a 1575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// target which has already been registered will be ignored. 1585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// 1595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// Clients are responsible for ensuring that registration doesn't occur 1605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// while another thread is attempting to access the registry. Typically 1615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// this is done by initializing all targets at program startup. 1625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// 1635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// @param T - The target being registered. 1645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao static void RegisterTarget(mcld::Target &T); 1655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// RegisterTargetMachine - Register a TargetMachine implementation for the 1675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// given target. 1685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// 1695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// @param T - The target being registered. 1705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// @param Fn - A function to construct a TargetMachine for the target. 171affc150dc44fab1911775a49636d0ce85333b634Zonr Chang static void RegisterTargetMachine(mcld::Target &T, mcld::Target::TargetMachineCtorTy Fn) 172affc150dc44fab1911775a49636d0ce85333b634Zonr Chang { 1735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // Ignore duplicate registration. 1745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (!T.TargetMachineCtorFn) 1755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao T.TargetMachineCtorFn = Fn; 1765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 1775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 17822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// RegisterMCLinker - Register a MCLinker implementation for the given 1795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// target. 1805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// 1815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// @param T - the target being registered 18222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// @param Fn - A function to create MCLinker for the target 18322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao static void RegisterMCLinker(mcld::Target &T, mcld::Target::MCLinkerCtorTy Fn) 184affc150dc44fab1911775a49636d0ce85333b634Zonr Chang { 18522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (!T.MCLinkerCtorFn) 18622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao T.MCLinkerCtorFn = Fn; 18722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao } 18822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 18922add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// RegisterEmulation - Register a emulation function for the target. 19022add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// target. 19122add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// 19222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// @param T - the target being registered 19322add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao /// @param Fn - A emulation function 19422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao static void RegisterEmulation(mcld::Target &T, mcld::Target::EmulationFnTy Fn) 19522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao { 19622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (!T.EmulationFn) 19722add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao T.EmulationFn = Fn; 1985460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 1995460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// RegisterTargetLDBackend - Register a TargetLDBackend implementation for 2015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// the given target. 2025460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// 2035460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// @param T - The target being registered 2045460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// @param Fn - A function to create TargetLDBackend for the target 205affc150dc44fab1911775a49636d0ce85333b634Zonr Chang static void RegisterTargetLDBackend(mcld::Target &T, mcld::Target::TargetLDBackendCtorTy Fn) 206affc150dc44fab1911775a49636d0ce85333b634Zonr Chang { 2075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if (!T.TargetLDBackendCtorFn) 2085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao T.TargetLDBackendCtorFn = Fn; 2095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 2105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 211affc150dc44fab1911775a49636d0ce85333b634Zonr Chang /// RegisterTargetDiagnosticLineInfo - Register a DiagnosticLineInfo 212affc150dc44fab1911775a49636d0ce85333b634Zonr Chang /// implementation for the given target. 213affc150dc44fab1911775a49636d0ce85333b634Zonr Chang /// 214affc150dc44fab1911775a49636d0ce85333b634Zonr Chang /// @param T - The target being registered 215affc150dc44fab1911775a49636d0ce85333b634Zonr Chang /// @param Fn - A function to create DiagnosticLineInfo for the target 216affc150dc44fab1911775a49636d0ce85333b634Zonr Chang static void 217affc150dc44fab1911775a49636d0ce85333b634Zonr Chang RegisterDiagnosticLineInfo(mcld::Target &T, 218affc150dc44fab1911775a49636d0ce85333b634Zonr Chang mcld::Target::DiagnosticLineInfoCtorTy Fn) 219affc150dc44fab1911775a49636d0ce85333b634Zonr Chang { 220affc150dc44fab1911775a49636d0ce85333b634Zonr Chang if (!T.DiagnosticLineInfoCtorFn) 221affc150dc44fab1911775a49636d0ce85333b634Zonr Chang T.DiagnosticLineInfoCtorFn = Fn; 222affc150dc44fab1911775a49636d0ce85333b634Zonr Chang } 223affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 2245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// lookupTarget - Lookup a target based on a llvm::Target. 2255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// 2265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// @param T - The llvm::Target to find 2275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao static const mcld::Target *lookupTarget(const llvm::Target& T); 2285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// lookupTarget - function wrapper of llvm::TargetRegistry::lookupTarget 2305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// 2315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// @param Triple - The Triple string 2325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao /// @param Error - The returned error message 2335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao static const mcld::Target *lookupTarget(const std::string &Triple, 2345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao std::string &Error); 2355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}; 2365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// RegisterTarget - Helper function for registering a target, for use in the 2385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// target's initialization function. Usage: 2395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// 2405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// Target TheFooTarget; // The global target instance. 2415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// 24222add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// extern "C" void MCLDInitializeFooTargetInfo() { 2435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// RegisterTarget X(TheFooTarget, "foo", "Foo description"); 2445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// } 2455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostruct RegisterTarget 2465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 2475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao RegisterTarget(mcld::Target &T, const char *Name) { 2485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao llvm::TargetRegistry::iterator TIter, TEnd = llvm::TargetRegistry::end(); 2495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao // lookup llvm::Target 2505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao for( TIter=llvm::TargetRegistry::begin(); TIter!=TEnd; ++TIter ) { 2515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao if( 0==strcmp(TIter->getName(), Name) ) 2525460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao break; 2535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 25422add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao 25522add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao if (TIter != TEnd) 25622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao T.setTarget(*TIter); 2575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao TargetRegistry::RegisterTarget(T); 2595460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 2605460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}; 2615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// RegisterTargetMachine - Helper template for registering a target machine 2635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// implementation, for use in the target machine initialization 2645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// function. Usage: 2655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// 26622add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao/// extern "C" void MCLDInitializeFooTarget() { 2675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// extern mcld::Target TheFooTarget; 2685460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// RegisterTargetMachine<mcld::FooTargetMachine> X(TheFooTarget); 2695460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao/// } 2705460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaotemplate<class TargetMachineImpl> 2715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaostruct RegisterTargetMachine 2725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 2735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao RegisterTargetMachine(mcld::Target &T) { 2745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao TargetRegistry::RegisterTargetMachine(T, &Allocator); 2755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 2765460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2775460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaoprivate: 27822add6ff3426df1a85089fe6a6e1597ee3b6f300Shih-wei Liao static mcld::MCLDTargetMachine *Allocator(const mcld::Target &T, 2795460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao llvm::TargetMachine& TM, 2805460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao const std::string &Triple) { 2815460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao return new TargetMachineImpl(TM, T, Triple); 2825460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao } 2835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao}; 2845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} //end namespace mcld 2865460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 2875460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#endif 2885460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 289