[llvm] 1477ed8 - [MC] Support SHF_GNU_RETAIN as section flag 'R'

Fangrui Song via llvm-commits llvm-commits at lists.llvm.org
Tue Feb 2 09:34:16 PST 2021


Author: Fangrui Song
Date: 2021-02-02T09:34:09-08:00
New Revision: 1477ed846508dc84610b7ca9570e590eb7e21797

URL: https://github.com/llvm/llvm-project/commit/1477ed846508dc84610b7ca9570e590eb7e21797
DIFF: https://github.com/llvm/llvm-project/commit/1477ed846508dc84610b7ca9570e590eb7e21797.diff

LOG: [MC] Support SHF_GNU_RETAIN as section flag 'R'

On Linux target triples, GNU as sets EI_OSABI to ELFOSABI_GNU when SHF_GNU_RETAIN is used。
On `*-*-freebsd`, it usually sets EI_OSABI to ELFOSABI_FREEBSD.

GNU ld respects SHF_GNU_RETAIN only for ELFOSABI_FREEBSD/ELFOSABI_GNU.
https://sourceware.org/bugzilla/show_bug.cgi?id=27282

MC doesn't set ELFOSABI_GNU for SHF_GNU_RETAIN/STB_GNU_UNIQUE/STT_GNU_IFUNC.
MC assembled object files do not have special semantics in GNU ld.

Reviewed By: psmith

Differential Revision: https://reviews.llvm.org/D95730

Added: 
    llvm/test/MC/ELF/section-gnu.s

Modified: 
    llvm/lib/MC/MCParser/ELFAsmParser.cpp
    llvm/lib/MC/MCSectionELF.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/MC/MCParser/ELFAsmParser.cpp b/llvm/lib/MC/MCParser/ELFAsmParser.cpp
index 544d6e6ba337..39ccaa45c9e1 100644
--- a/llvm/lib/MC/MCParser/ELFAsmParser.cpp
+++ b/llvm/lib/MC/MCParser/ELFAsmParser.cpp
@@ -326,6 +326,9 @@ static unsigned parseSectionFlags(StringRef flagsStr, bool *UseLastGroup) {
     case 'G':
       flags |= ELF::SHF_GROUP;
       break;
+    case 'R':
+      flags |= ELF::SHF_GNU_RETAIN;
+      break;
     case '?':
       *UseLastGroup = true;
       break;

diff  --git a/llvm/lib/MC/MCSectionELF.cpp b/llvm/lib/MC/MCSectionELF.cpp
index 27694cb14419..300f209d213d 100644
--- a/llvm/lib/MC/MCSectionELF.cpp
+++ b/llvm/lib/MC/MCSectionELF.cpp
@@ -102,6 +102,8 @@ void MCSectionELF::PrintSwitchToSection(const MCAsmInfo &MAI, const Triple &T,
     OS << 'T';
   if (Flags & ELF::SHF_LINK_ORDER)
     OS << 'o';
+  if (Flags & ELF::SHF_GNU_RETAIN)
+    OS << 'R';
 
   // If there are target-specific flags, print them.
   Triple::ArchType Arch = T.getArch();

diff  --git a/llvm/test/MC/ELF/section-gnu.s b/llvm/test/MC/ELF/section-gnu.s
new file mode 100644
index 000000000000..5fc72d99a971
--- /dev/null
+++ b/llvm/test/MC/ELF/section-gnu.s
@@ -0,0 +1,16 @@
+# RUN: llvm-mc -triple=x86_64 %s | FileCheck %s --check-prefix=ASM
+# RUN: llvm-mc -filetype=obj -triple=x86_64 %s | llvm-readobj -hS - | FileCheck %s --check-prefix=OBJ
+
+# ASM: .section retain,"aR", at progbits
+
+## Note: GNU as sets OSABI to GNU.
+# OBJ:      OS/ABI: SystemV (0x0)
+
+# OBJ:      Name: retain
+# OBJ-NEXT: Type: SHT_PROGBITS
+# OBJ-NEXT: Flags [
+# OBJ-NEXT:   SHF_ALLOC
+# OBJ-NEXT:   SHF_GNU_RETAIN
+# OBJ-NEXT: ]
+
+.section retain,"aR", at progbits


        


More information about the llvm-commits mailing list