1//===- TargetLinkerConfigs.cpp --------------------------------------------===//
2//
3//                     The MCLinker Project
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "alone/Config/Config.h"
11#include "alone/Support/TargetLinkerConfigs.h"
12
13#include <mcld/TargetOptions.h>
14#include <mcld/MC/InputFactory.h>
15#include <mcld/Fragment/Relocation.h>
16
17using namespace alone;
18
19#ifdef TARGET_BUILD
20static const char* gDefaultDyld = "/system/bin/linker";
21static const char* gDefaultSysroot = "/system";
22#else
23static const char* gDefaultDyld = "/usr/lib/ld.so.1";
24static const char* gDefaultSysroot = "/";
25#endif
26
27//===----------------------------------------------------------------------===//
28// ARM
29//===----------------------------------------------------------------------===//
30#if defined(PROVIDE_ARM_CODEGEN)
31ARMLinkerConfig::ARMLinkerConfig() : LinkerConfig(DEFAULT_ARM_TRIPLE_STRING) {
32
33  // set up target-dependent options
34  getLDConfig()->targets().setEndian(mcld::TargetOptions::Little);
35  getLDConfig()->targets().setBitClass(32);
36
37  // set up target-dependent constraints of attributes
38  getLDConfig()->attribute().constraint().enableWholeArchive();
39  getLDConfig()->attribute().constraint().disableAsNeeded();
40  getLDConfig()->attribute().constraint().setSharedSystem();
41
42  // set up the predefined attributes
43  getLDConfig()->attribute().predefined().unsetWholeArchive();
44  getLDConfig()->attribute().predefined().setDynamic();
45
46  // set up target dependent options
47  if (getLDScript()->sysroot().empty()) {
48    getLDScript()->setSysroot(gDefaultSysroot);
49  }
50
51  if (!getLDConfig()->options().hasDyld()) {
52    getLDConfig()->options().setDyld(gDefaultDyld);
53  }
54
55  // set up section map
56  if (getLDConfig()->codeGenType() != mcld::LinkerConfig::Object) {
57    bool exist = false;
58    getLDScript()->sectionMap().append(".ARM.exidx", ".ARM.exidx", exist);
59    getLDScript()->sectionMap().append(".ARM.extab", ".ARM.extab", exist);
60    getLDScript()->sectionMap().append(".ARM.attributes", ".ARM.attributes", exist);
61  }
62
63  // set up relocation factory
64  mcld::Relocation::SetUp(*getLDConfig());
65}
66#endif // defined(PROVIDE_ARM_CODEGEN)
67
68//===----------------------------------------------------------------------===//
69// Mips
70//===----------------------------------------------------------------------===//
71#if defined(PROVIDE_MIPS_CODEGEN)
72MipsLinkerConfig::MipsLinkerConfig()
73  : LinkerConfig(DEFAULT_MIPS_TRIPLE_STRING) {
74
75  // set up target-dependent options
76  getLDConfig()->targets().setEndian(mcld::TargetOptions::Little);
77  getLDConfig()->targets().setBitClass(32);
78
79  // set up target-dependent constraints of attibutes
80  getLDConfig()->attribute().constraint().enableWholeArchive();
81  getLDConfig()->attribute().constraint().disableAsNeeded();
82  getLDConfig()->attribute().constraint().setSharedSystem();
83
84  // set up the predefined attributes
85  getLDConfig()->attribute().predefined().unsetWholeArchive();
86  getLDConfig()->attribute().predefined().setDynamic();
87
88  // set up target dependent options
89  if (getLDScript()->sysroot().empty()) {
90    getLDScript()->setSysroot(gDefaultSysroot);
91  }
92
93  if (!getLDConfig()->options().hasDyld()) {
94    getLDConfig()->options().setDyld(gDefaultDyld);
95  }
96
97  // set up relocation factory
98  mcld::Relocation::SetUp(*getLDConfig());
99}
100#endif // defined(PROVIDE_MIPS_CODEGEN)
101
102//===----------------------------------------------------------------------===//
103// X86 and X86_64
104//===----------------------------------------------------------------------===//
105#if defined(PROVIDE_X86_CODEGEN)
106X86FamilyLinkerConfigBase::X86FamilyLinkerConfigBase(const std::string& pTriple)
107  : LinkerConfig(pTriple) {
108  // set up target-dependent options
109  getLDConfig()->targets().setEndian(mcld::TargetOptions::Little);
110  getLDConfig()->targets().setBitClass(32);
111
112  // set up target-dependent constraints of attibutes
113  getLDConfig()->attribute().constraint().enableWholeArchive();
114  getLDConfig()->attribute().constraint().disableAsNeeded();
115  getLDConfig()->attribute().constraint().setSharedSystem();
116
117  // set up the predefined attributes
118  getLDConfig()->attribute().predefined().unsetWholeArchive();
119  getLDConfig()->attribute().predefined().setDynamic();
120
121  // set up target dependent options
122  if (getLDScript()->sysroot().empty()) {
123    getLDScript()->setSysroot(gDefaultSysroot);
124  }
125
126  if (!getLDConfig()->options().hasDyld()) {
127    getLDConfig()->options().setDyld(gDefaultDyld);
128  }
129
130  // set up relocation factory
131  mcld::Relocation::SetUp(*getLDConfig());
132}
133
134X86_32LinkerConfig::X86_32LinkerConfig()
135  : X86FamilyLinkerConfigBase(DEFAULT_X86_TRIPLE_STRING) {
136}
137
138X86_64LinkerConfig::X86_64LinkerConfig()
139  : X86FamilyLinkerConfigBase(DEFAULT_X86_64_TRIPLE_STRING) {
140}
141#endif // defined(PROVIDE_X86_CODEGEN)
142
143#if !defined(TARGET_BUILD)
144//===----------------------------------------------------------------------===//
145// General
146//===----------------------------------------------------------------------===//
147GeneralLinkerConfig::GeneralLinkerConfig(const std::string& pTriple)
148  : LinkerConfig(pTriple) {
149
150  // set up target-dependent options
151  getLDConfig()->targets().setEndian(mcld::TargetOptions::Little);
152  getLDConfig()->targets().setBitClass(32);
153
154  // set up target-dependent constraints of attributes
155  getLDConfig()->attribute().constraint().enableWholeArchive();
156  getLDConfig()->attribute().constraint().disableAsNeeded();
157  getLDConfig()->attribute().constraint().setSharedSystem();
158
159  // set up the predefined attributes
160  getLDConfig()->attribute().predefined().unsetWholeArchive();
161  getLDConfig()->attribute().predefined().setDynamic();
162
163  // set up section map
164  if (llvm::Triple::arm == getLDConfig()->targets().triple().getArch() &&
165      getLDConfig()->codeGenType() != mcld::LinkerConfig::Object) {
166    bool exist = false;
167    getLDScript()->sectionMap().append(".ARM.exidx", ".ARM.exidx", exist);
168    getLDScript()->sectionMap().append(".ARM.extab", ".ARM.extab", exist);
169    getLDScript()->sectionMap().append(".ARM.attributes", ".ARM.attributes", exist);
170  }
171
172  // set up relocation factory
173  mcld::Relocation::SetUp(*getLDConfig());
174}
175#endif // defined(TARGET_BUILD)
176