You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
73 lines
2.6 KiB
73 lines
2.6 KiB
4 months ago
|
//===- ARMEmulation.cpp ---------------------------------------------------===//
|
||
|
//
|
||
|
// The MCLinker Project
|
||
|
//
|
||
|
// This file is distributed under the University of Illinois Open Source
|
||
|
// License. See LICENSE.TXT for details.
|
||
|
//
|
||
|
//===----------------------------------------------------------------------===//
|
||
|
#include "ARM.h"
|
||
|
#include "mcld/LinkerConfig.h"
|
||
|
#include "mcld/LinkerScript.h"
|
||
|
#include "mcld/Target/ELFEmulation.h"
|
||
|
#include "mcld/Support/TargetRegistry.h"
|
||
|
|
||
|
namespace mcld {
|
||
|
|
||
|
static bool MCLDEmulateARMELF(LinkerScript& pScript, LinkerConfig& pConfig) {
|
||
|
if (!MCLDEmulateELF(pScript, pConfig))
|
||
|
return false;
|
||
|
|
||
|
// set up bitclass and endian
|
||
|
pConfig.targets().setEndian(TargetOptions::Little);
|
||
|
pConfig.targets().setBitClass(32);
|
||
|
|
||
|
// set up target-dependent constraints of attributes
|
||
|
pConfig.attribute().constraint().enableWholeArchive();
|
||
|
pConfig.attribute().constraint().enableAsNeeded();
|
||
|
pConfig.attribute().constraint().setSharedSystem();
|
||
|
|
||
|
// set up the predefined attributes
|
||
|
pConfig.attribute().predefined().unsetWholeArchive();
|
||
|
pConfig.attribute().predefined().unsetAsNeeded();
|
||
|
pConfig.attribute().predefined().setDynamic();
|
||
|
|
||
|
// set up section map
|
||
|
if (pConfig.options().getScriptList().empty() &&
|
||
|
pConfig.codeGenType() != LinkerConfig::Object) {
|
||
|
pScript.sectionMap().insert(".ARM.exidx*", ".ARM.exidx");
|
||
|
pScript.sectionMap().insert(".ARM.extab*", ".ARM.extab");
|
||
|
pScript.sectionMap().insert(".ARM.attributes*", ".ARM.attributes");
|
||
|
}
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
//===----------------------------------------------------------------------===//
|
||
|
// emulateARMLD - the help function to emulate ARM ld
|
||
|
//===----------------------------------------------------------------------===//
|
||
|
bool emulateARMLD(LinkerScript& pScript, LinkerConfig& pConfig) {
|
||
|
if (pConfig.targets().triple().isOSDarwin()) {
|
||
|
assert(0 && "MachO linker has not supported yet");
|
||
|
return false;
|
||
|
}
|
||
|
if (pConfig.targets().triple().isOSWindows()) {
|
||
|
assert(0 && "COFF linker has not supported yet");
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
return MCLDEmulateARMELF(pScript, pConfig);
|
||
|
}
|
||
|
|
||
|
} // namespace mcld
|
||
|
|
||
|
//===----------------------------------------------------------------------===//
|
||
|
// ARMEmulation
|
||
|
//===----------------------------------------------------------------------===//
|
||
|
extern "C" void MCLDInitializeARMEmulation() {
|
||
|
// Register the emulation
|
||
|
mcld::TargetRegistry::RegisterEmulation(mcld::TheARMTarget,
|
||
|
mcld::emulateARMLD);
|
||
|
mcld::TargetRegistry::RegisterEmulation(mcld::TheThumbTarget,
|
||
|
mcld::emulateARMLD);
|
||
|
}
|