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