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//===----------------------------------------------------------------------===// 937b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/Target.h" 1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines 11f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines#include <llvm/ADT/Triple.h> 12f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 1337b74a387bb3993387029859c2d9d051c41c724eStephen Hinesnamespace mcld { 14f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 15f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//===----------------------------------------------------------------------===// 16f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines// Target 17f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines//===----------------------------------------------------------------------===// 18f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen HinesTarget::Target() 1937b74a387bb3993387029859c2d9d051c41c724eStephen Hines : Name(NULL), 2037b74a387bb3993387029859c2d9d051c41c724eStephen Hines TripleMatchQualityFn(NULL), 2137b74a387bb3993387029859c2d9d051c41c724eStephen Hines TargetMachineCtorFn(NULL), 2237b74a387bb3993387029859c2d9d051c41c724eStephen Hines MCLinkerCtorFn(NULL), 2337b74a387bb3993387029859c2d9d051c41c724eStephen Hines TargetLDBackendCtorFn(NULL), 2437b74a387bb3993387029859c2d9d051c41c724eStephen Hines DiagnosticLineInfoCtorFn(NULL) { 25f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 26f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 2737b74a387bb3993387029859c2d9d051c41c724eStephen Hinesunsigned int Target::getTripleQuality(const llvm::Triple& pTriple) const { 2837b74a387bb3993387029859c2d9d051c41c724eStephen Hines if (TripleMatchQualityFn == NULL) 29f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return 0; 30f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return TripleMatchQualityFn(pTriple); 31f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 32f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 3337b74a387bb3993387029859c2d9d051c41c724eStephen HinesMCLDTargetMachine* Target::createTargetMachine(const std::string& pTriple, 3437b74a387bb3993387029859c2d9d051c41c724eStephen Hines const llvm::Target& pTarget, 3537b74a387bb3993387029859c2d9d051c41c724eStephen Hines llvm::TargetMachine& pTM) const { 3637b74a387bb3993387029859c2d9d051c41c724eStephen Hines if (TargetMachineCtorFn == NULL) 37f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return NULL; 38f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return TargetMachineCtorFn(pTarget, *this, pTM, pTriple); 39f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 40f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 41f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines/// createMCLinker - create target-specific MCLinker 4237b74a387bb3993387029859c2d9d051c41c724eStephen HinesMCLinker* Target::createMCLinker(const std::string& pTriple, 4337b74a387bb3993387029859c2d9d051c41c724eStephen Hines LinkerConfig& pConfig, 4437b74a387bb3993387029859c2d9d051c41c724eStephen Hines Module& pModule, 4537b74a387bb3993387029859c2d9d051c41c724eStephen Hines FileHandle& pFileHandle) const { 4637b74a387bb3993387029859c2d9d051c41c724eStephen Hines if (MCLinkerCtorFn == NULL) 47f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return NULL; 48f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return MCLinkerCtorFn(pTriple, pConfig, pModule, pFileHandle); 49f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 50f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 51f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines/// emulate - given MCLinker default values for the other aspects of the 52f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines/// target system. 5337b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool Target::emulate(LinkerScript& pScript, LinkerConfig& pConfig) const { 5437b74a387bb3993387029859c2d9d051c41c724eStephen Hines if (EmulationFn == NULL) 55f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return false; 56f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return EmulationFn(pScript, pConfig); 57f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 58f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 59f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines/// createLDBackend - create target-specific LDBackend 6037b74a387bb3993387029859c2d9d051c41c724eStephen HinesTargetLDBackend* Target::createLDBackend(const LinkerConfig& pConfig) const { 6137b74a387bb3993387029859c2d9d051c41c724eStephen Hines if (TargetLDBackendCtorFn == NULL) 6237b74a387bb3993387029859c2d9d051c41c724eStephen Hines return NULL; 6337b74a387bb3993387029859c2d9d051c41c724eStephen Hines return TargetLDBackendCtorFn(pConfig); 64f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 65f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 66f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines/// createDiagnosticLineInfo - create target-specific DiagnosticLineInfo 6737b74a387bb3993387029859c2d9d051c41c724eStephen HinesDiagnosticLineInfo* Target::createDiagnosticLineInfo( 6837b74a387bb3993387029859c2d9d051c41c724eStephen Hines const mcld::Target& pTarget, 6937b74a387bb3993387029859c2d9d051c41c724eStephen Hines const std::string& pTriple) const { 7037b74a387bb3993387029859c2d9d051c41c724eStephen Hines if (DiagnosticLineInfoCtorFn == NULL) 71f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return NULL; 72f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines return DiagnosticLineInfoCtorFn(pTarget, pTriple); 73f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines} 74f33f6de54db174aa679a4b6d1e040d37e95541c0Stephen Hines 7537b74a387bb3993387029859c2d9d051c41c724eStephen Hines} // namespace mcld 76