From fc5436c95132cbbf3c2fc950d3c5906cc8ed62dd Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Wed, 5 Mar 2014 20:09:15 +0000 Subject: [PATCH] Always print the implicit .text at the start of an asm file. Before llvm-mc would print it, but llc was assuming that it would produce another section changing directive before one was needed. That assumption is false with inline asm. Fixes PR19049. Another option would be to always create the section, but in the asm printer avoid printing sections changes during initialization. That would work, but * We do use the fact that llvm-mc prints it in testing. The tests can be changed if needed. * A quick poll on IRC suggest that most developers prefer the implicit .text to be printed. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@203001 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/MC/MCELFStreamer.h | 2 +- include/llvm/MC/MCStreamer.h | 5 +---- lib/CodeGen/AsmPrinter/AsmPrinter.cpp | 2 +- lib/MC/MCAsmStreamer.cpp | 5 ----- lib/MC/MCELFStreamer.cpp | 2 +- lib/MC/MCStreamer.cpp | 2 +- lib/MC/WinCOFFStreamer.cpp | 4 ++-- test/CodeGen/X86/GC/ocaml-gc.ll | 6 ++++-- test/CodeGen/X86/pr19049.ll | 7 +++++++ 9 files changed, 18 insertions(+), 17 deletions(-) create mode 100644 test/CodeGen/X86/pr19049.ll diff --git a/include/llvm/MC/MCELFStreamer.h b/include/llvm/MC/MCELFStreamer.h index 46b32d0de6f..ad25e2ce7d4 100644 --- a/include/llvm/MC/MCELFStreamer.h +++ b/include/llvm/MC/MCELFStreamer.h @@ -44,7 +44,7 @@ public: /// @name MCStreamer Interface /// @{ - virtual void InitSections(bool Force); + virtual void InitSections(); virtual void ChangeSection(const MCSection *Section, const MCExpr *Subsection); virtual void EmitLabel(MCSymbol *Symbol); diff --git a/include/llvm/MC/MCStreamer.h b/include/llvm/MC/MCStreamer.h index 43fa42ba812..e9f6196063f 100644 --- a/include/llvm/MC/MCStreamer.h +++ b/include/llvm/MC/MCStreamer.h @@ -352,10 +352,7 @@ public: } /// Create the default sections and set the initial one. - /// - /// @param Force - If false, a text streamer implementation can be a nop. - /// Used by CodeGen to avoid starting every file with '.text'. - virtual void InitSections(bool Force = true); + virtual void InitSections(); /// AssignSection - Sets the symbol's section. /// diff --git a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp index 4d35e863106..fb1d42c06f4 100644 --- a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -175,7 +175,7 @@ bool AsmPrinter::doInitialization(Module &M) { const_cast(getObjFileLowering()) .Initialize(OutContext, TM); - OutStreamer.InitSections(false); + OutStreamer.InitSections(); Mang = new Mangler(TM.getDataLayout()); diff --git a/lib/MC/MCAsmStreamer.cpp b/lib/MC/MCAsmStreamer.cpp index 31f5de56d74..8f0a702fb1c 100644 --- a/lib/MC/MCAsmStreamer.cpp +++ b/lib/MC/MCAsmStreamer.cpp @@ -127,11 +127,6 @@ public: virtual void ChangeSection(const MCSection *Section, const MCExpr *Subsection); - virtual void InitSections(bool Force) { - if (Force) - SwitchSection(getContext().getObjectFileInfo()->getTextSection()); - } - virtual void EmitLabel(MCSymbol *Symbol); virtual void EmitDebugLabel(MCSymbol *Symbol); diff --git a/lib/MC/MCELFStreamer.cpp b/lib/MC/MCELFStreamer.cpp index 9ff9665d52d..5f6a889769d 100644 --- a/lib/MC/MCELFStreamer.cpp +++ b/lib/MC/MCELFStreamer.cpp @@ -38,7 +38,7 @@ using namespace llvm; MCELFStreamer::~MCELFStreamer() { } -void MCELFStreamer::InitSections(bool Force) { +void MCELFStreamer::InitSections() { // This emulates the same behavior of GNU as. This makes it easier // to compare the output as the major sections are in the same order. SwitchSection(getContext().getObjectFileInfo()->getTextSection()); diff --git a/lib/MC/MCStreamer.cpp b/lib/MC/MCStreamer.cpp index 02065daf247..08373895814 100644 --- a/lib/MC/MCStreamer.cpp +++ b/lib/MC/MCStreamer.cpp @@ -205,7 +205,7 @@ void MCStreamer::EmitEHSymAttributes(const MCSymbol *Symbol, MCSymbol *EHSymbol) { } -void MCStreamer::InitSections(bool Force) { +void MCStreamer::InitSections() { SwitchSection(getContext().getObjectFileInfo()->getTextSection()); } diff --git a/lib/MC/WinCOFFStreamer.cpp b/lib/MC/WinCOFFStreamer.cpp index 445d26106ad..55ae2fe23b3 100644 --- a/lib/MC/WinCOFFStreamer.cpp +++ b/lib/MC/WinCOFFStreamer.cpp @@ -50,7 +50,7 @@ public: // MCStreamer interface - virtual void InitSections(bool Force); + virtual void InitSections(); virtual void EmitLabel(MCSymbol *Symbol); virtual void EmitDebugLabel(MCSymbol *Symbol); virtual void EmitAssemblerFlag(MCAssemblerFlag Flag); @@ -123,7 +123,7 @@ void WinCOFFStreamer::AddCommonSymbol(MCSymbol *Symbol, uint64_t Size, // MCStreamer interface -void WinCOFFStreamer::InitSections(bool Force) { +void WinCOFFStreamer::InitSections() { // FIXME: this is identical to the ELF one. // This emulates the same behavior of GNU as. This makes it easier // to compare the output as the major sections are in the same order. diff --git a/test/CodeGen/X86/GC/ocaml-gc.ll b/test/CodeGen/X86/GC/ocaml-gc.ll index 6d5f8aebe13..37ddaf90bf6 100644 --- a/test/CodeGen/X86/GC/ocaml-gc.ll +++ b/test/CodeGen/X86/GC/ocaml-gc.ll @@ -1,8 +1,10 @@ ; RUN: llc < %s -mtriple=x86_64-linux-gnu | FileCheck %s -define i32 @main(i32 %x) nounwind gc "ocaml" { ; CHECK: .text -; CHECK-NEXT: .globl "caml__code_begin" +; CHECK-NEXT: .file "" + +define i32 @main(i32 %x) nounwind gc "ocaml" { +; CHECK: .globl "caml__code_begin" ; CHECK-NEXT: "caml__code_begin": ; CHECK-NEXT: .data ; CHECK-NEXT: .globl "caml__data_begin" diff --git a/test/CodeGen/X86/pr19049.ll b/test/CodeGen/X86/pr19049.ll new file mode 100644 index 00000000000..027c9815e0c --- /dev/null +++ b/test/CodeGen/X86/pr19049.ll @@ -0,0 +1,7 @@ +; RUN: llc -mtriple x86_64-pc-linux %s -o - | FileCheck %s + +module asm ".pushsection foo" +module asm ".popsection" + +; CHECK: .section foo,"",@progbits +; CHECK: .text