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"
1037b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LinkerScript.h"
1137b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/LinkerConfig.h"
1237b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Support/TargetRegistry.h"
1337b74a387bb3993387029859c2d9d051c41c724eStephen Hines#include "mcld/Target/ELFEmulation.h"
146f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
156f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesnamespace mcld {
166f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
1737b74a387bb3993387029859c2d9d051c41c724eStephen Hinesstatic bool MCLDEmulateHexagonELF(LinkerScript& pScript,
1837b74a387bb3993387029859c2d9d051c41c724eStephen Hines                                  LinkerConfig& pConfig) {
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//===----------------------------------------------------------------------===//
4137b74a387bb3993387029859c2d9d051c41c724eStephen Hinesbool emulateHexagonLD(LinkerScript& pScript, LinkerConfig& pConfig) {
42f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  if (pConfig.targets().triple().isOSDarwin()) {
436f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    assert(0 && "MachO linker has not supported yet");
446f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    return false;
456f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  }
46f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  if (pConfig.targets().triple().isOSWindows()) {
476f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    assert(0 && "COFF linker has not supported yet");
486f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines    return false;
496f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  }
506f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
51f7ac0f19a1c8d0ad14bcf6456ce368b830fea886Stephen Hines  return MCLDEmulateHexagonELF(pScript, pConfig);
526f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines}
536f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
5437b74a387bb3993387029859c2d9d051c41c724eStephen Hines}  // namespace mcld
556f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines
566f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===----------------------------------------------------------------------===//
576f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines// HexagonEmulation
586f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines//===----------------------------------------------------------------------===//
596f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hinesextern "C" void MCLDInitializeHexagonEmulation() {
606f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  // Register the emulation
616f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines  mcld::TargetRegistry::RegisterEmulation(mcld::TheHexagonTarget,
626f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines                                          mcld::emulateHexagonLD);
636f75755c9204b1d8817ae5a65a2f7e5af0ec3f70Stephen Hines}
64