16f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===- HexagonEmulation.cpp -----------------------------------------------===//
26f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//
36f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//                     The MCLinker Project
46f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//
56f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// This file is distributed under the University of Illinois Open Source
66f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// License. See LICENSE.TXT for details.
76f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//
86f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===----------------------------------------------------------------------===//
96f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include "Hexagon.h"
10f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines#include <mcld/LinkerScript.h>
116f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <mcld/LinkerConfig.h>
126f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <mcld/Target/ELFEmulation.h>
136f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines#include <mcld/Support/TargetRegistry.h>
146f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
156f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesnamespace mcld {
166f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
17f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesstatic bool MCLDEmulateHexagonELF(LinkerScript& pScript, LinkerConfig& pConfig)
186f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{
19f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  if (!MCLDEmulateELF(pScript, pConfig))
206f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    return false;
216f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
226f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  // set up bitclass and endian
236f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  pConfig.targets().setEndian(TargetOptions::Little);
246f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  pConfig.targets().setBitClass(32);
256f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
266f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  // set up target-dependent constraints of attributes
276f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  pConfig.attribute().constraint().enableWholeArchive();
286f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  pConfig.attribute().constraint().enableAsNeeded();
296f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  pConfig.attribute().constraint().setSharedSystem();
306f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
316f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  // set up the predefined attributes
326f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  pConfig.attribute().predefined().unsetWholeArchive();
336f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  pConfig.attribute().predefined().unsetAsNeeded();
346f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  pConfig.attribute().predefined().setDynamic();
356f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  return true;
366f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines}
376f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
386f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===----------------------------------------------------------------------===//
396f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// emulateHexagonLD - the help function to emulate Hexagon ld
406f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===----------------------------------------------------------------------===//
41f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hinesbool emulateHexagonLD(LinkerScript& pScript, LinkerConfig& pConfig)
426f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines{
43f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  if (pConfig.targets().triple().isOSDarwin()) {
446f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    assert(0 && "MachO linker has not supported yet");
456f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    return false;
466f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  }
47f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  if (pConfig.targets().triple().isOSWindows()) {
486f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    assert(0 && "COFF linker has not supported yet");
496f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    return false;
506f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  }
516f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
52f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  return MCLDEmulateHexagonELF(pScript, pConfig);
536f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines}
546f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
556f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines} // namespace of mcld
566f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
576f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===----------------------------------------------------------------------===//
586f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// HexagonEmulation
596f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===----------------------------------------------------------------------===//
606f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesextern "C" void MCLDInitializeHexagonEmulation() {
616f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  // Register the emulation
626f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  mcld::TargetRegistry::RegisterEmulation(mcld::TheHexagonTarget,
636f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines                                          mcld::emulateHexagonLD);
646f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines}
656f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
66