diff --git a/llvm/include/llvm/MC/MCAsmInfo.h b/llvm/include/llvm/MC/MCAsmInfo.h --- a/llvm/include/llvm/MC/MCAsmInfo.h +++ b/llvm/include/llvm/MC/MCAsmInfo.h @@ -214,6 +214,12 @@ const char *TPRel32Directive = nullptr; const char *TPRel64Directive = nullptr; + /// This is true if this target is compatible with "Sun Style" syntax for + /// section switching + /// ("#alloc,#write" etc) alongside the normal ELF syntax (,"a,w") in + /// .section directives. Defaults to false. + bool IsCompatibleWithSunStyleELFSectionSwitchSyntax = false; + /// This is true if this target uses "Sun Style" syntax for section switching /// ("#alloc,#write" etc) instead of the normal ELF syntax (,"a,w") in /// .section directives. Defaults to false. @@ -471,6 +477,11 @@ return SunStyleELFSectionSwitchSyntax; } + bool supportsSunStyleELFSectionSwitchSyntax() const { + return SunStyleELFSectionSwitchSyntax || + IsCompatibleWithSunStyleELFSectionSwitchSyntax; + } + bool usesELFSectionDirectiveForBSS() const { return UsesELFSectionDirectiveForBSS; } diff --git a/llvm/lib/MC/MCParser/ELFAsmParser.cpp b/llvm/lib/MC/MCParser/ELFAsmParser.cpp --- a/llvm/lib/MC/MCParser/ELFAsmParser.cpp +++ b/llvm/lib/MC/MCParser/ELFAsmParser.cpp @@ -528,8 +528,10 @@ unsigned extraFlags; if (getLexer().isNot(AsmToken::String)) { - if (!getContext().getAsmInfo()->usesSunStyleELFSectionSwitchSyntax() - || getLexer().isNot(AsmToken::Hash)) + if (!getContext() + .getAsmInfo() + ->supportsSunStyleELFSectionSwitchSyntax() || + getLexer().isNot(AsmToken::Hash)) return TokError("expected string in directive"); extraFlags = parseSunStyleSectionFlags(); } else { diff --git a/llvm/lib/Target/ARM/MCTargetDesc/ARMMCAsmInfo.cpp b/llvm/lib/Target/ARM/MCTargetDesc/ARMMCAsmInfo.cpp --- a/llvm/lib/Target/ARM/MCTargetDesc/ARMMCAsmInfo.cpp +++ b/llvm/lib/Target/ARM/MCTargetDesc/ARMMCAsmInfo.cpp @@ -75,6 +75,10 @@ UseParensForSymbolVariant = true; UseIntegratedAssembler = true; + + // The GNU assembler supports Sun style section switching for Arm targets, and + // it is used in projects like the Linux kernel. + IsCompatibleWithSunStyleELFSectionSwitchSyntax = true; } void ARMELFMCAsmInfo::setUseIntegratedAssembler(bool Value) { diff --git a/llvm/test/MC/AsmParser/gas-compl-sun-elf.s b/llvm/test/MC/AsmParser/gas-compl-sun-elf.s new file mode 100644 --- /dev/null +++ b/llvm/test/MC/AsmParser/gas-compl-sun-elf.s @@ -0,0 +1,13 @@ +@ RUN: llvm-mc -filetype=obj -triple arm-linux-gnu %s -o - | llvm-readelf --sections | FileCheck %s + +@ CHECK: .f1 PROGBITS 00000000 000034 000000 00 A 0 0 1 +.section ".f1", #alloc + +@ CHECK: .f2 PROGBITS 00000000 000034 000000 00 W 0 0 1 +.section ".f2", #write + +@ CHECK: .f3 PROGBITS 00000000 000034 000000 00 A 0 0 1 +.section ".f3", "a" + +@ CHECK: .f4 PROGBITS 00000000 000034 000000 00 W 0 0 1 +.section ".f4", "w"