Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions lld/ELF/Driver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -991,6 +991,15 @@ processCallGraphRelocations(SmallVector<uint32_t, 32> &symbolIndices,
for (size_t i = 0, e = objSections.size(); i < e; ++i) {
const Elf_Shdr_Impl<ELFT> &sec = objSections[i];
if (sec.sh_info == inputObj->cgProfileSectionIndex) {
if (sec.sh_type == SHT_CREL) {
auto crels =
CHECK(obj.crels(sec), "could not retrieve cg profile rela section");
for (const auto &rel : crels.first)
symbolIndices.push_back(rel.getSymbol(false));
for (const auto &rel : crels.second)
symbolIndices.push_back(rel.getSymbol(false));
break;
}
if (sec.sh_type == SHT_RELA) {
ArrayRef<typename ELFT::Rela> relas =
CHECK(obj.relas(sec), "could not retrieve cg profile rela section");
Expand Down
10 changes: 6 additions & 4 deletions lld/ELF/Relocations.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -459,7 +459,8 @@ class OffsetGetter {
// InputSectionBase.
class RelocationScanner {
public:
template <class ELFT> void scanSection(InputSectionBase &s);
template <class ELFT>
void scanSection(InputSectionBase &s, bool isEH = false);

private:
InputSectionBase *sec;
Expand Down Expand Up @@ -1617,10 +1618,11 @@ void RelocationScanner::scan(Relocs<RelTy> rels) {
});
}

template <class ELFT> void RelocationScanner::scanSection(InputSectionBase &s) {
template <class ELFT>
void RelocationScanner::scanSection(InputSectionBase &s, bool isEH) {
sec = &s;
getter = OffsetGetter(s);
const RelsOrRelas<ELFT> rels = s.template relsOrRelas<ELFT>();
const RelsOrRelas<ELFT> rels = s.template relsOrRelas<ELFT>(!isEH);
if (rels.areRelocsCrel())
scan<ELFT>(rels.crels);
else if (rels.areRelocsRel())
Expand Down Expand Up @@ -1658,7 +1660,7 @@ template <class ELFT> void elf::scanRelocations() {
RelocationScanner scanner;
for (Partition &part : partitions) {
for (EhInputSection *sec : part.ehFrame->sections)
scanner.template scanSection<ELFT>(*sec);
scanner.template scanSection<ELFT>(*sec, /*isEH=*/true);
if (part.armExidx && part.armExidx->isLive())
for (InputSection *sec : part.armExidx->exidxSections)
if (sec->isLive())
Expand Down
6 changes: 5 additions & 1 deletion lld/test/ELF/cgprofile-rela.test
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,10 @@
# RUN: ld.lld --no-call-graph-profile-sort %t.o -o %t
# RUN: llvm-nm --no-sort %t | FileCheck %s --check-prefix=NO-CG

# RUN: yaml2obj -DTYPE=SHT_CREL %s -o %tcrel.o
# RUN: ld.lld --call-graph-profile-sort=hfsort %tcrel.o -o %t
# RUN: llvm-nm --no-sort %t | FileCheck %s

# CHECK: 0000000000201124 t D
# CHECK: 0000000000201122 t C
# CHECK: 0000000000201128 t B
Expand Down Expand Up @@ -60,7 +64,7 @@ Sections:
- Weight: 30
- Weight: 90
- Name: .rela.llvm.call-graph-profile
Type: SHT_RELA
Type: [[TYPE=SHT_RELA]]
Info: .llvm.call-graph-profile
Relocations:
- Offset: 0x0
Expand Down
8 changes: 8 additions & 0 deletions lld/test/ELF/crel.s
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
# RUN: ld.lld -pie a.o b.o -o out
# RUN: llvm-objdump -d out | FileCheck %s
# RUN: llvm-readelf -Srs out | FileCheck %s --check-prefix=RELOC
# RUN: llvm-dwarfdump --eh-frame out | FileCheck %s --check-prefix=UNWIND

# CHECK: <_start>:
# CHECK-NEXT: callq {{.*}} <foo>
Expand All @@ -18,6 +19,13 @@

# RELOC: {{0*}}[[#DATA+8]] 0000000000000008 R_X86_64_RELATIVE [[#%x,DATA+0x8000000000000000]]

# RELOC: 00000000000012f4 0 NOTYPE GLOBAL DEFAULT [[#]] _start
# RELOC-NEXT: 00000000000012fe 0 NOTYPE GLOBAL DEFAULT [[#]] foo

## initial_location fields in FDEs are correctly relocated.
# UNWIND: 00000018 00000010 0000001c FDE cie=00000000 pc=000012f4...000012fe
# UNWIND: 0000002c 00000010 00000030 FDE cie=00000000 pc=000012fe...0000130c

# RUN: ld.lld -pie --emit-relocs a.o b.o -o out1
# RUN: llvm-objdump -dr out1 | FileCheck %s --check-prefix=CHECKE
# RUN: llvm-readelf -Sr out1 | FileCheck %s --check-prefix=RELOCE
Expand Down