mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 11:13:28 +01:00
[MC] Set defaults based on section names and support name suffixes
Set correct default flags and section type based on its name for .text, .data, .bss, .init_array, .fini_array, .preinit_array, .tdata, and .tbss and support section name suffixes for .data.*, .rodata.*, .text.*, .bss.*, .tdata.* and .tbss.* which matches the behavior of GAS. Fixes PR31888. Differential Revision: https://reviews.llvm.org/D30229 llvm-svn: 299484
This commit is contained in:
parent
4b7c6d9d15
commit
6a9c1cd63d
@ -493,11 +493,20 @@ bool ELFAsmParser::ParseSectionArguments(bool IsPush, SMLoc loc) {
|
||||
int64_t UniqueID = ~0;
|
||||
|
||||
// Set the defaults first.
|
||||
if (SectionName == ".fini" || SectionName == ".init" ||
|
||||
SectionName == ".rodata")
|
||||
if (hasPrefix(SectionName, ".rodata.") || SectionName == ".rodata1")
|
||||
Flags |= ELF::SHF_ALLOC;
|
||||
if (SectionName == ".fini" || SectionName == ".init")
|
||||
Flags |= ELF::SHF_EXECINSTR;
|
||||
if (SectionName == ".fini" || SectionName == ".init" ||
|
||||
hasPrefix(SectionName, ".text."))
|
||||
Flags |= ELF::SHF_ALLOC | ELF::SHF_EXECINSTR;
|
||||
if (hasPrefix(SectionName, ".data.") || SectionName == ".data1" ||
|
||||
hasPrefix(SectionName, ".bss.") ||
|
||||
hasPrefix(SectionName, ".init_array.") ||
|
||||
hasPrefix(SectionName, ".fini_array.") ||
|
||||
hasPrefix(SectionName, ".preinit_array."))
|
||||
Flags |= ELF::SHF_ALLOC | ELF::SHF_WRITE;
|
||||
if (hasPrefix(SectionName, ".tdata.") ||
|
||||
hasPrefix(SectionName, ".tbss."))
|
||||
Flags |= ELF::SHF_ALLOC | ELF::SHF_WRITE | ELF::SHF_TLS;
|
||||
|
||||
if (getLexer().is(AsmToken::Comma)) {
|
||||
Lex();
|
||||
@ -575,9 +584,9 @@ EndStmt:
|
||||
Type = ELF::SHT_NOBITS;
|
||||
else if (hasPrefix(SectionName, ".tbss."))
|
||||
Type = ELF::SHT_NOBITS;
|
||||
else if (SectionName == ".fini_array")
|
||||
else if (hasPrefix(SectionName, ".fini_array."))
|
||||
Type = ELF::SHT_FINI_ARRAY;
|
||||
else if (SectionName == ".preinit_array")
|
||||
else if (hasPrefix(SectionName, ".preinit_array."))
|
||||
Type = ELF::SHT_PREINIT_ARRAY;
|
||||
} else {
|
||||
if (TypeName == "init_array")
|
||||
|
@ -220,3 +220,50 @@ bar:
|
||||
// CHECK-NEXT: Size:
|
||||
// CHECK-NEXT: Link: 22
|
||||
// CHECK-NEXT: Info: 0
|
||||
|
||||
.section .text.foo
|
||||
// CHECK: Section {
|
||||
// CHECK: Name: .text.foo
|
||||
// CHECK-NEXT: Type: SHT_PROGBITS
|
||||
// CHECK-NEXT: Flags [
|
||||
// CHECK-NEXT: SHF_ALLOC
|
||||
// CHECK-NEXT: SHF_EXECINSTR
|
||||
// CHECK-NEXT: ]
|
||||
|
||||
.section .bss
|
||||
// CHECK: Section {
|
||||
// CHECK: Name: .bss
|
||||
// CHECK-NEXT: Type: SHT_NOBITS
|
||||
// CHECK-NEXT: Flags [
|
||||
// CHECK-NEXT: SHF_ALLOC
|
||||
// CHECK-NEXT: SHF_WRITE
|
||||
// CHECK-NEXT: ]
|
||||
|
||||
.section .bss.foo
|
||||
// CHECK: Section {
|
||||
// CHECK: Name: .bss.foo
|
||||
// CHECK-NEXT: Type: SHT_NOBITS
|
||||
// CHECK-NEXT: Flags [
|
||||
// CHECK-NEXT: SHF_ALLOC
|
||||
// CHECK-NEXT: SHF_WRITE
|
||||
// CHECK-NEXT: ]
|
||||
|
||||
.section .tbss
|
||||
// CHECK: Section {
|
||||
// CHECK: Name: .tbss
|
||||
// CHECK-NEXT: Type: SHT_NOBITS
|
||||
// CHECK-NEXT: Flags [
|
||||
// CHECK-NEXT: SHF_ALLOC
|
||||
// CHECK-NEXT: SHF_TLS
|
||||
// CHECK-NEXT: SHF_WRITE
|
||||
// CHECK-NEXT: ]
|
||||
|
||||
.section .tbss.foo
|
||||
// CHECK: Section {
|
||||
// CHECK: Name: .tbss.foo
|
||||
// CHECK-NEXT: Type: SHT_NOBITS
|
||||
// CHECK-NEXT: Flags [
|
||||
// CHECK-NEXT: SHF_ALLOC
|
||||
// CHECK-NEXT: SHF_TLS
|
||||
// CHECK-NEXT: SHF_WRITE
|
||||
// CHECK-NEXT: ]
|
||||
|
Loading…
Reference in New Issue
Block a user