Fix a regression in .pop_section.
authorRafael Espindola <rafael.espindola@gmail.com>
Mon, 8 Jun 2015 20:08:55 +0000 (20:08 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Mon, 8 Jun 2015 20:08:55 +0000 (20:08 +0000)
It was calling ChangeSection with the wrong current section, eventually leading
to a crash.

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

include/llvm/MC/MCStreamer.h
test/MC/ELF/popsection.s [new file with mode: 0644]

index 5374e0ad5739ae76280553866c8419e84262a77d..628fb768856ebad0322dc6aaafc561ef236717e0 100644 (file)
@@ -307,11 +307,15 @@ public:
   bool PopSection() {
     if (SectionStack.size() <= 1)
       return false;
-    MCSectionSubPair oldSection = SectionStack.pop_back_val().first;
-    MCSectionSubPair curSection = SectionStack.back().first;
-
-    if (oldSection != curSection)
-      ChangeSection(curSection.first, curSection.second);
+    auto I = SectionStack.end();
+    --I;
+    MCSectionSubPair OldSection = I->first;
+    --I;
+    MCSectionSubPair NewSection = I->first;
+
+    if (OldSection != NewSection)
+      ChangeSection(NewSection.first, NewSection.second);
+    SectionStack.pop_back();
     return true;
   }
 
diff --git a/test/MC/ELF/popsection.s b/test/MC/ELF/popsection.s
new file mode 100644 (file)
index 0000000..19f5568
--- /dev/null
@@ -0,0 +1,21 @@
+// RUN: llvm-mc -filetype=obj %s -o - -triple x86_64-pc-linux | llvm-readobj -s - | FileCheck %s
+
+// This used to crash. Test that it create an empty section instead.
+
+        .pushsection foo
+        .popsection
+
+// CHECK:       Section {
+// CHECK:         Index: 5
+// CHECK-NEXT:    Name: foo
+// CHECK-NEXT:    Type: SHT_PROGBITS
+// CHECK-NEXT:    Flags [ (0x0)
+// CHECK-NEXT:    ]
+// CHECK-NEXT:    Address: 0x0
+// CHECK-NEXT:    Offset:
+// CHECK-NEXT:    Size: 0
+// CHECK-NEXT:    Link: 0
+// CHECK-NEXT:    Info: 0
+// CHECK-NEXT:    AddressAlignment: 1
+// CHECK-NEXT:    EntrySize: 0
+// CHECK-NEXT:  }