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