| //===- 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/Target/ELFEmulation.h> |
| #include <mcld/Support/TargetRegistry.h> |
| |
| namespace mcld { |
| |
| static bool MCLDEmulateARMELF(LinkerConfig& pConfig) |
| { |
| if (!MCLDEmulateELF(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.codeGenType() != LinkerConfig::Object) { |
| bool exist = false; |
| pConfig.scripts().sectionMap().append(".ARM.exidx", ".ARM.exidx", exist); |
| pConfig.scripts().sectionMap().append(".ARM.extab", ".ARM.extab", exist); |
| pConfig.scripts().sectionMap().append(".ARM.attributes", ".ARM.attributes", exist); |
| } |
| return true; |
| } |
| |
| //===----------------------------------------------------------------------===// |
| // emulateARMLD - the help function to emulate ARM ld |
| //===----------------------------------------------------------------------===// |
| bool emulateARMLD(const std::string& pTriple, LinkerConfig& pConfig) |
| { |
| llvm::Triple theTriple(pTriple); |
| if (theTriple.isOSDarwin()) { |
| assert(0 && "MachO linker has not supported yet"); |
| return false; |
| } |
| if (theTriple.isOSWindows()) { |
| assert(0 && "COFF linker has not supported yet"); |
| return false; |
| } |
| |
| return MCLDEmulateARMELF(pConfig); |
| } |
| |
| } // namespace of mcld |
| |
| //===----------------------------------------------------------------------===// |
| // ARMEmulation |
| //===----------------------------------------------------------------------===// |
| extern "C" void MCLDInitializeARMEmulation() { |
| // Register the emulation |
| mcld::TargetRegistry::RegisterEmulation(mcld::TheARMTarget, mcld::emulateARMLD); |
| mcld::TargetRegistry::RegisterEmulation(mcld::TheThumbTarget, mcld::emulateARMLD); |
| } |
| |