[llvm] r300831 - [ARM] Fix handling of mapping symbols when changing sections

John Brawn via llvm-commits llvm-commits at lists.llvm.org
Thu Apr 20 03:18:14 PDT 2017


Author: john.brawn
Date: Thu Apr 20 05:18:13 2017
New Revision: 300831

URL: http://llvm.org/viewvc/llvm-project?rev=300831&view=rev
Log:
[ARM] Fix handling of mapping symbols when changing sections

ChangeSection incorrectly registers LastEMSInfo as belonging to the previous
section, not the current section. This happens to work when changing sections
using .section, as the previous section is set to the current section before
the call to ChangeSection, but not when using .popsection.

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

Modified:
    llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp
    llvm/trunk/test/MC/ARM/multi-section-mapping.s

Modified: llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp?rev=300831&r1=300830&r2=300831&view=diff
==============================================================================
--- llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp (original)
+++ llvm/trunk/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp Thu Apr 20 05:18:13 2017
@@ -464,7 +464,7 @@ public:
   void emitUnwindRaw(int64_t Offset, const SmallVectorImpl<uint8_t> &Opcodes);
 
   void ChangeSection(MCSection *Section, const MCExpr *Subsection) override {
-    LastMappingSymbols[getPreviousSection().first] = std::move(LastEMSInfo);
+    LastMappingSymbols[getCurrentSection().first] = std::move(LastEMSInfo);
     MCELFStreamer::ChangeSection(Section, Subsection);
     auto LastMappingSymbol = LastMappingSymbols.find(Section);
     if (LastMappingSymbol != LastMappingSymbols.end()) {

Modified: llvm/trunk/test/MC/ARM/multi-section-mapping.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ARM/multi-section-mapping.s?rev=300831&r1=300830&r2=300831&view=diff
==============================================================================
--- llvm/trunk/test/MC/ARM/multi-section-mapping.s (original)
+++ llvm/trunk/test/MC/ARM/multi-section-mapping.s Thu Apr 20 05:18:13 2017
@@ -21,14 +21,31 @@
         .arm
         add r0, r0, r0
 
+@ Similarly no $t if we change back .starts_thumb using .pushsection
+        .pushsection .starts_thumb
+        .thumb
+        adds r0, r0, r0
+
+@ When we change back to .text using .popsection .thumb is still active, so we
+@ should emit a $t
+        .popsection
+        add r0, r0, r0
+
+@ .ident does a push then pop of the .comment section, so the .word should
+@ cause $d to appear in the .text section
+        .ident "ident"
+        .word 0
+
 @ With all those constraints, we want:
-@   + .text to have $a at 0 and no others
+@   + .text to have $a at 0, $t at 8, $d at 12
 @   + .wibble to have $a at 0
 @   + .starts_thumb to have $t at 0
 @   + .starts_data to have $d at 0
 
 @ CHECK: 00000000 .text 00000000 $a
 @ CHECK-NEXT: 00000000 .wibble 00000000 $a
+@ CHECK-NEXT: 0000000a .text 00000000 $d
 @ CHECK-NEXT: 00000000 .starts_thumb 00000000 $t
+@ CHECK-NEXT: 00000008 .text 00000000 $t
 @ CHECK-NOT: ${{[adt]}}
 




More information about the llvm-commits mailing list