[lld-macho] Add isCodeSection()
This is the same logic that ld64 uses to determine which sections contain functions. This was added so that we could determine which STABS entries should be N_FUN. Reviewed By: clayborg Differential Revision: https://reviews.llvm.org/D92430
This commit is contained in:
parent
78f6498cdc
commit
c7dbaec396
|
|
@ -58,6 +58,23 @@ void InputSection::writeTo(uint8_t *buf) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool macho::isCodeSection(InputSection *isec) {
|
||||||
|
uint32_t type = isec->flags & MachO::SECTION_TYPE;
|
||||||
|
if (type != S_REGULAR && type != S_COALESCED)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
uint32_t attr = isec->flags & MachO::SECTION_ATTRIBUTES_USR;
|
||||||
|
if (attr == S_ATTR_PURE_INSTRUCTIONS)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if (isec->segname == segment_names::text)
|
||||||
|
return StringSwitch<bool>(isec->name)
|
||||||
|
.Cases("__textcoal_nt", "__StaticInit", true)
|
||||||
|
.Default(false);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
std::string lld::toString(const InputSection *isec) {
|
std::string lld::toString(const InputSection *isec) {
|
||||||
return (toString(isec->file) + ":(" + isec->name + ")").str();
|
return (toString(isec->file) + ":(" + isec->name + ")").str();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -76,6 +76,8 @@ public:
|
||||||
std::vector<Reloc> relocs;
|
std::vector<Reloc> relocs;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
bool isCodeSection(InputSection *);
|
||||||
|
|
||||||
extern std::vector<InputSection *> inputSections;
|
extern std::vector<InputSection *> inputSections;
|
||||||
|
|
||||||
} // namespace macho
|
} // namespace macho
|
||||||
|
|
|
||||||
|
|
@ -668,9 +668,7 @@ void SymtabSection::emitStabs() {
|
||||||
symStab.strx = stringTableSection.addString(defined->getName());
|
symStab.strx = stringTableSection.addString(defined->getName());
|
||||||
symStab.value = defined->getVA();
|
symStab.value = defined->getVA();
|
||||||
|
|
||||||
// XXX is it right to assume that all symbols in __text are function
|
if (isCodeSection(isec)) {
|
||||||
// symbols?
|
|
||||||
if (isec->name == "__text") {
|
|
||||||
symStab.type = MachO::N_FUN;
|
symStab.type = MachO::N_FUN;
|
||||||
stabs.emplace_back(std::move(symStab));
|
stabs.emplace_back(std::move(symStab));
|
||||||
emitEndFunStab(defined);
|
emitEndFunStab(defined);
|
||||||
|
|
|
||||||
|
|
@ -36,12 +36,15 @@
|
||||||
# CHECK-NEXT: [[#DATA_ID:]] __data
|
# CHECK-NEXT: [[#DATA_ID:]] __data
|
||||||
# CHECK-NEXT: [[#MORE_DATA_ID:]] more_data
|
# CHECK-NEXT: [[#MORE_DATA_ID:]] more_data
|
||||||
# CHECK-NEXT: [[#COMM_ID:]] __common
|
# CHECK-NEXT: [[#COMM_ID:]] __common
|
||||||
|
# CHECK-NEXT: [[#MORE_TEXT_ID:]] more_text
|
||||||
|
|
||||||
# CHECK: 0000000000000000 - 00 0000 SO /tmp/test.cpp
|
# CHECK: 0000000000000000 - 00 0000 SO /tmp/test.cpp
|
||||||
# CHECK-NEXT: 0000000000000010 - 03 0001 OSO [[DIR]]/test.o
|
# CHECK-NEXT: 0000000000000010 - 03 0001 OSO [[DIR]]/test.o
|
||||||
# CHECK-NEXT: [[#%x, STATIC:]] - 0[[#MORE_DATA_ID + 1]] 0000 STSYM _static_var
|
# CHECK-NEXT: [[#%x, STATIC:]] - 0[[#MORE_DATA_ID + 1]] 0000 STSYM _static_var
|
||||||
# CHECK-NEXT: [[#%x, MAIN:]] - 0[[#TEXT_ID + 1]] 0000 FUN _main
|
# CHECK-NEXT: [[#%x, MAIN:]] - 0[[#TEXT_ID + 1]] 0000 FUN _main
|
||||||
# CHECK-NEXT: 0000000000000006 - 00 0000 FUN
|
# CHECK-NEXT: 0000000000000006 - 00 0000 FUN
|
||||||
|
# CHECK-NEXT: [[#%x, FUN:]] - 0[[#MORE_TEXT_ID + 1]] 0000 FUN _fun
|
||||||
|
# CHECK-NEXT: 0000000000000001 - 00 0000 FUN
|
||||||
# CHECK-NEXT: [[#%x, GLOB:]] - 0[[#DATA_ID + 1]] 0000 GSYM _global_var
|
# CHECK-NEXT: [[#%x, GLOB:]] - 0[[#DATA_ID + 1]] 0000 GSYM _global_var
|
||||||
# CHECK-NEXT: [[#%x, ZERO:]] - 0[[#COMM_ID + 1]] 0000 GSYM _zero
|
# CHECK-NEXT: [[#%x, ZERO:]] - 0[[#COMM_ID + 1]] 0000 GSYM _zero
|
||||||
# CHECK-NEXT: 0000000000000000 - 01 0000 SO
|
# CHECK-NEXT: 0000000000000000 - 01 0000 SO
|
||||||
|
|
@ -53,6 +56,7 @@
|
||||||
# CHECK-NEXT: [[#STATIC]] s _static_var
|
# CHECK-NEXT: [[#STATIC]] s _static_var
|
||||||
# CHECK-NEXT: [[#MAIN]] T _main
|
# CHECK-NEXT: [[#MAIN]] T _main
|
||||||
# CHECK-NEXT: {{[0-9af]+}} A _abs
|
# CHECK-NEXT: {{[0-9af]+}} A _abs
|
||||||
|
# CHECK-NEXT: [[#FUN]] S _fun
|
||||||
# CHECK-NEXT: [[#GLOB]] D _global_var
|
# CHECK-NEXT: [[#GLOB]] D _global_var
|
||||||
# CHECK-NEXT: [[#ZERO]] S _zero
|
# CHECK-NEXT: [[#ZERO]] S _zero
|
||||||
# CHECK-NEXT: [[#FOO]] T _foo
|
# CHECK-NEXT: [[#FOO]] T _foo
|
||||||
|
|
@ -121,6 +125,11 @@ Ldebug_info_end0:
|
||||||
.subsections_via_symbols
|
.subsections_via_symbols
|
||||||
.section __DWARF,__debug_line,regular,debug
|
.section __DWARF,__debug_line,regular,debug
|
||||||
|
|
||||||
|
.section OTHER,more_text,regular,pure_instructions
|
||||||
|
.globl _fun
|
||||||
|
_fun:
|
||||||
|
ret
|
||||||
|
|
||||||
#--- foo.s
|
#--- foo.s
|
||||||
.text
|
.text
|
||||||
.globl _foo
|
.globl _foo
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue