bool ARMGNULDBackend::readSection(Input& pInput, MCLinker& pLinker, LDSection& pInputSectHdr) { LDSection& out_sect = pLinker.getOrCreateOutputSectHdr(pInputSectHdr.name(), pInputSectHdr.kind(), pInputSectHdr.type(), pInputSectHdr.flag()); // FIXME: (Luba) // Handle ARM attributes in the right way. // In current milestone, MCLinker goes through the shortcut. // It reads input's ARM attributes and copies the first ARM attributes // into the output file. The correct way is merge these sections, not // just copy. if ((0 == out_sect.name().compare(".ARM.attributes")) && (0 != out_sect.size())) return true; MemoryRegion* region = pInput.memArea()->request(pInputSectHdr.offset(), pInputSectHdr.size()); llvm::MCSectionData& sect_data = pLinker.getOrCreateSectData(pInputSectHdr); new MCRegionFragment(*region, §_data); out_sect.setSize(out_sect.size() + pInputSectHdr.size()); return true; }
/// merge Input Sections bool HexagonLDBackend::mergeSection(Module& pModule, const Input& pInputFile, LDSection& pInputSection) { if ((pInputSection.flag() & llvm::ELF::SHF_HEX_GPREL) || (pInputSection.kind() == LDFileFormat::LinkOnce) || (pInputSection.kind() == LDFileFormat::Target)) { SectionData* sd = NULL; if (!m_psdata->hasSectionData()) { sd = IRBuilder::CreateSectionData(*m_psdata); m_psdata->setSectionData(sd); } sd = m_psdata->getSectionData(); MoveSectionDataAndSort(*pInputSection.getSectionData(), *sd); } else { ObjectBuilder builder(pModule); builder.MergeSection(pInputFile, pInputSection); } return true; }