1f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//===- Target.cpp ---------------------------------------------------------===// 2f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// 3f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// The MCLinker Project 4f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// 5f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// This file is distributed under the University of Illinois Open Source 6f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// License. See LICENSE.TXT for details. 7f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// 8f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//===----------------------------------------------------------------------===// 9f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#include <mcld/Support/Target.h> 10f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#include <llvm/ADT/Triple.h> 11f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 12f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinesusing namespace mcld; 13f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 14f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//===----------------------------------------------------------------------===// 15f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// Target 16f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//===----------------------------------------------------------------------===// 17f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesTarget::Target() 18f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines : Name(NULL), 19f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines TripleMatchQualityFn(NULL), 20f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines TargetMachineCtorFn(NULL), 21f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines MCLinkerCtorFn(NULL), 22f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines TargetLDBackendCtorFn(NULL), 23f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines DiagnosticLineInfoCtorFn(NULL) { 24f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 25f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 26f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinesunsigned int Target::getTripleQuality(const llvm::Triple& pTriple) const 27f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 28f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines if (NULL == TripleMatchQualityFn) 29f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return 0; 30f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return TripleMatchQualityFn(pTriple); 31f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 32f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 33f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesMCLDTargetMachine* 34f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesTarget::createTargetMachine(const std::string& pTriple, 35f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines const llvm::Target& pTarget, 36f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines llvm::TargetMachine& pTM) const 37f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 38f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines if (NULL == TargetMachineCtorFn) 39f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return NULL; 40f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return TargetMachineCtorFn(pTarget, *this, pTM, pTriple); 41f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 42f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 43f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines/// createMCLinker - create target-specific MCLinker 44f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesMCLinker* 45f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesTarget::createMCLinker(const std::string &pTriple, 46f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines LinkerConfig& pConfig, 47f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines Module& pModule, 48f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines FileHandle& pFileHandle) const 49f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 50f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines if (NULL == MCLinkerCtorFn) 51f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return NULL; 52f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return MCLinkerCtorFn(pTriple, pConfig, pModule, pFileHandle); 53f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 54f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 55f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines/// emulate - given MCLinker default values for the other aspects of the 56f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines/// target system. 57f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hinesbool Target::emulate(LinkerScript& pScript, LinkerConfig& pConfig) const 58f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 59f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines if (NULL == EmulationFn) 60f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return false; 61f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return EmulationFn(pScript, pConfig); 62f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 63f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 64f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines/// createLDBackend - create target-specific LDBackend 65f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesTargetLDBackend* Target::createLDBackend(const LinkerConfig& pConfig) const 66f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 67f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines if (NULL == TargetLDBackendCtorFn) 68f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return NULL; 69f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return TargetLDBackendCtorFn(pConfig); 70f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 71f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 72f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines/// createDiagnosticLineInfo - create target-specific DiagnosticLineInfo 73f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesDiagnosticLineInfo* 74f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesTarget::createDiagnosticLineInfo(const mcld::Target& pTarget, 75f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines const std::string& pTriple) const 76f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines{ 77f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines if (NULL == DiagnosticLineInfoCtorFn) 78f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return NULL; 79f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return DiagnosticLineInfoCtorFn(pTarget, pTriple); 80f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 81f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 82