[PATCH] D51361: [llvm-mc] - Allow to set custom flags for debug sections.

George Rimar via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Aug 28 08:33:38 PDT 2018


grimar created this revision.
grimar added reviewers: JDevlieghere, dblaikie, aprantl.
Herald added subscribers: arichardson, emaste.
Herald added a reviewer: espindola.

I am experimenting with a single split dwarf (.dwo sections in .o files).
I want to make linker to ignore .dwo sections in .o, for that I am trying to add
SHF_EXCLUDE flag ("E") for them in my asm sample.

I found that currently, it is impossible to add any flag for debug sections using llvm-mc.

That happens because we have a set of predefined unique sections created early with default flags:
https://github.com/llvm-mirror/llvm/blob/master/lib/MC/MCObjectFileInfo.cpp#L391

This patch allows a user to add any flags he wants.

I had to edit TargetLoweringObjectFileImpl.cpp to set `MetaData` type for debug sections.
Their kind was `Data` by default (so they were allocatable) and so after changes introduced by
this patch the SHF_ALLOC flag was applied for them, what does not make sense for debug sections.
One of OrcJITTests tests failed because of that.


https://reviews.llvm.org/D51361

Files:
  lib/CodeGen/TargetLoweringObjectFileImpl.cpp
  lib/MC/MCContext.cpp
  test/MC/ELF/section-flags.s


Index: test/MC/ELF/section-flags.s
===================================================================
--- test/MC/ELF/section-flags.s
+++ test/MC/ELF/section-flags.s
@@ -0,0 +1,12 @@
+# RUN: llvm-mc -triple x86_64-pc-linux-gnu %s -filetype=obj -o %t.o
+# RUN: llvm-readobj -s --elf-output-style=GNU %t.o | FileCheck %s
+
+## Check we are able to set the custom flag ('E') for debug sections.
+# CHECK: .debug_info   {{.*}}  E
+# CHECK: .debug_str    {{.*}}  EMS
+
+.section .debug_info,"e"
+nop
+
+.section .debug_str,"eMS", at progbits,1
+nop
Index: lib/MC/MCContext.cpp
===================================================================
--- lib/MC/MCContext.cpp
+++ lib/MC/MCContext.cpp
@@ -394,6 +394,15 @@
   auto IterBool = ELFUniquingMap.insert(
       std::make_pair(ELFSectionKey{Section.str(), Group, UniqueID}, nullptr));
   auto &Entry = *IterBool.first;
+  MCSectionELF *&Sec = Entry.second;
+  if (!IterBool.second) {
+    // We want to let users add additional flags even for sections with
+    // defaults. For example, .debug_str has "MS" flags by default and user
+    // might want to add "E".
+    Sec->setFlags(Sec->getFlags() | Flags);
+    return Sec;
+  }
+
   if (!IterBool.second)
     return Entry.second;
 
@@ -407,10 +416,9 @@
   else
     Kind = SectionKind::getReadOnly();
 
-  MCSectionELF *Result = createELFSectionImpl(
-      CachedName, Type, Flags, Kind, EntrySize, GroupSym, UniqueID, Associated);
-  Entry.second = Result;
-  return Result;
+  Sec = createELFSectionImpl(CachedName, Type, Flags, Kind, EntrySize, GroupSym,
+                             UniqueID, Associated);
+  return Sec;
 }
 
 MCSectionELF *MCContext::createELFGroupSection(const MCSymbolELF *Group) {
Index: lib/CodeGen/TargetLoweringObjectFileImpl.cpp
===================================================================
--- lib/CodeGen/TargetLoweringObjectFileImpl.cpp
+++ lib/CodeGen/TargetLoweringObjectFileImpl.cpp
@@ -424,6 +424,9 @@
       Name.startswith(".llvm.linkonce.tb."))
     return SectionKind::getThreadBSS();
 
+  if (Name.startswith(".debug_"))
+    return SectionKind::getMetadata();
+
   return K;
 }
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D51361.162876.patch
Type: text/x-patch
Size: 2131 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180828/d080400c/attachment.bin>


More information about the llvm-commits mailing list