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