]> granicus.if.org Git - llvm/commitdiff
[ARM] Fix handling of mapping symbols when changing sections
authorJohn Brawn <john.brawn@arm.com>
Thu, 20 Apr 2017 10:18:13 +0000 (10:18 +0000)
committerJohn Brawn <john.brawn@arm.com>
Thu, 20 Apr 2017 10:18:13 +0000 (10:18 +0000)
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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@300831 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp
test/MC/ARM/multi-section-mapping.s

index 6fa890ba1cd5e25c8ac9208f91437cbea9e56f59..4d6c52f3cd4925d19222e3471d352f320a11f036 100644 (file)
@@ -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()) {
index e4b7146e4b0f703a72577f68c7729a33eab19190..7e62b10f5b0961a7367d8437ce20bb7fd5098c13 100644 (file)
         .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]}}