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