From 13bfce64bcebf6492fb2af82424ab4b34c7a2ac6 Mon Sep 17 00:00:00 2001 From: Weiming Zhao Date: Tue, 28 Mar 2017 17:15:11 +0000 Subject: [PATCH] Revert "Dont emit Mapping symbols for sections that contain only data." It breaks some lld tests. This reverts commit 3a50eea6d9732ab40e9a7aebe6be777b53a8b35c. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@298932 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/MC/MCELFStreamer.h | 1 - include/llvm/MC/MCObjectStreamer.h | 1 - lib/MC/MCELFStreamer.cpp | 10 --- lib/MC/MCObjectStreamer.cpp | 18 +--- .../ARM/MCTargetDesc/ARMELFStreamer.cpp | 82 ++++--------------- test/MC/ARM/Inputs/1.s | 3 - test/MC/ARM/Inputs/2.s | 3 - test/MC/ARM/Inputs/3.s | 3 - test/MC/ARM/Inputs/4.s | 2 - test/MC/ARM/Inputs/5.s | 2 - test/MC/ARM/Inputs/6.s | 12 --- test/MC/ARM/Inputs/7.s | 3 - test/MC/ARM/Inputs/attr.s | 5 -- test/MC/ARM/Inputs/ident.s | 1 - test/MC/ARM/data-in-code.ll | 17 ++++ test/MC/ARM/mappingsymbols.s | 48 ----------- test/MC/ARM/multi-section-mapping.s | 1 + test/Object/ARM/nm-mapping-symbol.s | 1 - 18 files changed, 36 insertions(+), 177 deletions(-) delete mode 100644 test/MC/ARM/Inputs/1.s delete mode 100644 test/MC/ARM/Inputs/2.s delete mode 100644 test/MC/ARM/Inputs/3.s delete mode 100644 test/MC/ARM/Inputs/4.s delete mode 100644 test/MC/ARM/Inputs/5.s delete mode 100644 test/MC/ARM/Inputs/6.s delete mode 100644 test/MC/ARM/Inputs/7.s delete mode 100644 test/MC/ARM/Inputs/attr.s delete mode 100644 test/MC/ARM/Inputs/ident.s delete mode 100644 test/MC/ARM/mappingsymbols.s diff --git a/include/llvm/MC/MCELFStreamer.h b/include/llvm/MC/MCELFStreamer.h index 90434f34da5..ea9ade459e0 100644 --- a/include/llvm/MC/MCELFStreamer.h +++ b/include/llvm/MC/MCELFStreamer.h @@ -42,7 +42,6 @@ public: void InitSections(bool NoExecStack) override; void ChangeSection(MCSection *Section, const MCExpr *Subsection) override; void EmitLabel(MCSymbol *Symbol, SMLoc Loc = SMLoc()) override; - void EmitLabel(MCSymbol *Symbol, SMLoc Loc, MCFragment *F) override; void EmitAssemblerFlag(MCAssemblerFlag Flag) override; void EmitThumbFunc(MCSymbol *Func) override; void EmitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol) override; diff --git a/include/llvm/MC/MCObjectStreamer.h b/include/llvm/MC/MCObjectStreamer.h index 11f8dfa2448..978a2409526 100644 --- a/include/llvm/MC/MCObjectStreamer.h +++ b/include/llvm/MC/MCObjectStreamer.h @@ -90,7 +90,6 @@ public: /// @{ void EmitLabel(MCSymbol *Symbol, SMLoc Loc = SMLoc()) override; - virtual void EmitLabel(MCSymbol *Symbol, SMLoc Loc, MCFragment *F); void EmitAssignment(MCSymbol *Symbol, const MCExpr *Value) override; void EmitValueImpl(const MCExpr *Value, unsigned Size, SMLoc Loc = SMLoc()) override; diff --git a/lib/MC/MCELFStreamer.cpp b/lib/MC/MCELFStreamer.cpp index c8e0223c057..de0791281d2 100644 --- a/lib/MC/MCELFStreamer.cpp +++ b/lib/MC/MCELFStreamer.cpp @@ -103,16 +103,6 @@ void MCELFStreamer::EmitLabel(MCSymbol *S, SMLoc Loc) { Symbol->setType(ELF::STT_TLS); } -void MCELFStreamer::EmitLabel(MCSymbol *S, SMLoc Loc, MCFragment *F) { - auto *Symbol = cast(S); - MCObjectStreamer::EmitLabel(Symbol, Loc, F); - - const MCSectionELF &Section = - static_cast(*getCurrentSectionOnly()); - if (Section.getFlags() & ELF::SHF_TLS) - Symbol->setType(ELF::STT_TLS); -} - void MCELFStreamer::EmitAssemblerFlag(MCAssemblerFlag Flag) { // Let the target do whatever target specific stuff it needs to do. getAssembler().getBackend().handleAssemblerFlag(Flag); diff --git a/lib/MC/MCObjectStreamer.cpp b/lib/MC/MCObjectStreamer.cpp index 726326be2ee..8f502fc3e2f 100644 --- a/lib/MC/MCObjectStreamer.cpp +++ b/lib/MC/MCObjectStreamer.cpp @@ -171,16 +171,6 @@ void MCObjectStreamer::EmitLabel(MCSymbol *Symbol, SMLoc Loc) { } } -void MCObjectStreamer::EmitLabel(MCSymbol *Symbol, SMLoc Loc, MCFragment *F) { - MCStreamer::EmitLabel(Symbol, Loc); - getAssembler().registerSymbol(*Symbol); - auto *DF = dyn_cast_or_null(F); - if (DF) - Symbol->setFragment(F); - else - PendingLabels.push_back(Symbol); -} - void MCObjectStreamer::EmitULEB128Value(const MCExpr *Value) { int64_t IntValue; if (Value->evaluateAsAbsolute(IntValue, getAssembler())) { @@ -501,8 +491,8 @@ void MCObjectStreamer::EmitGPRel32Value(const MCExpr *Value) { MCDataFragment *DF = getOrCreateDataFragment(); flushPendingLabels(DF, DF->getContents().size()); - DF->getFixups().push_back( - MCFixup::create(DF->getContents().size(), Value, FK_GPRel_4)); + DF->getFixups().push_back(MCFixup::create(DF->getContents().size(), + Value, FK_GPRel_4)); DF->getContents().resize(DF->getContents().size() + 4, 0); } @@ -511,8 +501,8 @@ void MCObjectStreamer::EmitGPRel64Value(const MCExpr *Value) { MCDataFragment *DF = getOrCreateDataFragment(); flushPendingLabels(DF, DF->getContents().size()); - DF->getFixups().push_back( - MCFixup::create(DF->getContents().size(), Value, FK_GPRel_4)); + DF->getFixups().push_back(MCFixup::create(DF->getContents().size(), + Value, FK_GPRel_4)); DF->getContents().resize(DF->getContents().size() + 8, 0); } diff --git a/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp b/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp index 2959f982c43..f7bdda491cb 100644 --- a/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp +++ b/lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp @@ -464,14 +464,13 @@ public: void emitUnwindRaw(int64_t Offset, const SmallVectorImpl &Opcodes); void ChangeSection(MCSection *Section, const MCExpr *Subsection) override { - LastMappingSymbols[getPreviousSection().first] = std::move(LastEMSInfo); + // We have to keep track of the mapping symbol state of any sections we + // use. Each one should start off as EMS_None, which is provided as the + // default constructor by DenseMap::lookup. + LastMappingSymbols[getPreviousSection().first] = LastEMS; + LastEMS = LastMappingSymbols.lookup(Section); + MCELFStreamer::ChangeSection(Section, Subsection); - auto LastMappingSymbol = LastMappingSymbols.find(Section); - if (LastMappingSymbol != LastMappingSymbols.end()) { - LastEMSInfo = std::move(LastMappingSymbol->second); - return; - } - LastEMSInfo.reset(new ElfMappingSymbolInfo(SMLoc(), nullptr, 0)); } /// This function is the one used to emit instruction data into the ELF @@ -533,14 +532,6 @@ public: MCELFStreamer::EmitBytes(Data); } - void FlushPendingMappingSymbol() { - if (!LastEMSInfo->hasInfo()) - return; - ElfMappingSymbolInfo *EMS = LastEMSInfo.get(); - EmitMappingSymbol("$d", EMS->Loc, EMS->F, EMS->Offset); - EMS->resetInfo(); - } - /// This is one of the functions used to emit data into an ELF section, so the /// ARM streamer overrides it to add the appropriate mapping symbol ($d) if /// necessary. @@ -582,54 +573,22 @@ private: EMS_Data }; - struct ElfMappingSymbolInfo { - explicit ElfMappingSymbolInfo(SMLoc Loc, MCFragment *F, uint64_t O) - : Loc(Loc), F(F), Offset(O), State(EMS_None) {} - void resetInfo() { - F = nullptr; - Offset = 0; - } - bool hasInfo() { return F != nullptr; } - SMLoc Loc; - MCFragment *F; - uint64_t Offset; - ElfMappingSymbol State; - }; - void EmitDataMappingSymbol() { - if (LastEMSInfo->State == EMS_Data) - return; - else if (LastEMSInfo->State == EMS_None) { - // This is a tentative symbol, it won't really be emitted until it's - // actually needed. - ElfMappingSymbolInfo *EMS = LastEMSInfo.get(); - auto *DF = dyn_cast_or_null(getCurrentFragment()); - if (!DF) - return; - EMS->Loc = SMLoc(); - EMS->F = getCurrentFragment(); - EMS->Offset = DF->getContents().size(); - LastEMSInfo->State = EMS_Data; - return; - } + if (LastEMS == EMS_Data) return; EmitMappingSymbol("$d"); - LastEMSInfo->State = EMS_Data; + LastEMS = EMS_Data; } void EmitThumbMappingSymbol() { - if (LastEMSInfo->State == EMS_Thumb) - return; - FlushPendingMappingSymbol(); + if (LastEMS == EMS_Thumb) return; EmitMappingSymbol("$t"); - LastEMSInfo->State = EMS_Thumb; + LastEMS = EMS_Thumb; } void EmitARMMappingSymbol() { - if (LastEMSInfo->State == EMS_ARM) - return; - FlushPendingMappingSymbol(); + if (LastEMS == EMS_ARM) return; EmitMappingSymbol("$a"); - LastEMSInfo->State = EMS_ARM; + LastEMS = EMS_ARM; } void EmitMappingSymbol(StringRef Name) { @@ -642,17 +601,6 @@ private: Symbol->setExternal(false); } - void EmitMappingSymbol(StringRef Name, SMLoc Loc, MCFragment *F, - uint64_t Offset) { - auto *Symbol = cast(getContext().getOrCreateSymbol( - Name + "." + Twine(MappingSymbolCounter++))); - EmitLabel(Symbol, Loc, F); - Symbol->setType(ELF::STT_NOTYPE); - Symbol->setBinding(ELF::STB_LOCAL); - Symbol->setExternal(false); - Symbol->setOffset(Offset); - } - void EmitThumbFunc(MCSymbol *Func) override { getAssembler().setIsThumbFunc(Func); EmitSymbolAttribute(Func, MCSA_ELF_TypeFunction); @@ -678,10 +626,8 @@ private: bool IsThumb; int64_t MappingSymbolCounter = 0; - DenseMap> - LastMappingSymbols; - - std::unique_ptr LastEMSInfo; + DenseMap LastMappingSymbols; + ElfMappingSymbol LastEMS = EMS_None; // ARM Exception Handling Frame Information MCSymbol *ExTab; diff --git a/test/MC/ARM/Inputs/1.s b/test/MC/ARM/Inputs/1.s deleted file mode 100644 index 0afcc633f64..00000000000 --- a/test/MC/ARM/Inputs/1.s +++ /dev/null @@ -1,3 +0,0 @@ - .section .foobar,"ax",%progbits - nop - .word 32 diff --git a/test/MC/ARM/Inputs/2.s b/test/MC/ARM/Inputs/2.s deleted file mode 100644 index 0ecdb294ab8..00000000000 --- a/test/MC/ARM/Inputs/2.s +++ /dev/null @@ -1,3 +0,0 @@ - .section .foobar,"",%progbits - nop - .word 32 diff --git a/test/MC/ARM/Inputs/3.s b/test/MC/ARM/Inputs/3.s deleted file mode 100644 index 09392623fc1..00000000000 --- a/test/MC/ARM/Inputs/3.s +++ /dev/null @@ -1,3 +0,0 @@ - .section .foobar,"aw",%progbits - nop - .word 32 diff --git a/test/MC/ARM/Inputs/4.s b/test/MC/ARM/Inputs/4.s deleted file mode 100644 index 28d8244bb41..00000000000 --- a/test/MC/ARM/Inputs/4.s +++ /dev/null @@ -1,2 +0,0 @@ - .section .foobar,"",%progbits - .word 32 diff --git a/test/MC/ARM/Inputs/5.s b/test/MC/ARM/Inputs/5.s deleted file mode 100644 index 1faef539b13..00000000000 --- a/test/MC/ARM/Inputs/5.s +++ /dev/null @@ -1,2 +0,0 @@ - .section .foobar,"aw",%progbits - .word 32 diff --git a/test/MC/ARM/Inputs/6.s b/test/MC/ARM/Inputs/6.s deleted file mode 100644 index 0fdb9daaf29..00000000000 --- a/test/MC/ARM/Inputs/6.s +++ /dev/null @@ -1,12 +0,0 @@ - .section .foo - .word 30 - .word 31 - .word 32 - .word 33 - nop - .word 34 - .word 35 - .word 36 - .word 37 - .word 38 - nop diff --git a/test/MC/ARM/Inputs/7.s b/test/MC/ARM/Inputs/7.s deleted file mode 100644 index b92a61ec971..00000000000 --- a/test/MC/ARM/Inputs/7.s +++ /dev/null @@ -1,3 +0,0 @@ - .section .foobar,"aw",%progbits - .word 32 - nop diff --git a/test/MC/ARM/Inputs/attr.s b/test/MC/ARM/Inputs/attr.s deleted file mode 100644 index 412cad76842..00000000000 --- a/test/MC/ARM/Inputs/attr.s +++ /dev/null @@ -1,5 +0,0 @@ - .text - .syntax unified - .eabi_attribute 67, "2.09" @ Tag_conformance - .cpu arm7tdmi - .eabi_attribute 6, 2 @ Tag_CPU_arch diff --git a/test/MC/ARM/Inputs/ident.s b/test/MC/ARM/Inputs/ident.s deleted file mode 100644 index 19d65fcc7e0..00000000000 --- a/test/MC/ARM/Inputs/ident.s +++ /dev/null @@ -1 +0,0 @@ - .ident "LLVM ARM Compiler" diff --git a/test/MC/ARM/data-in-code.ll b/test/MC/ARM/data-in-code.ll index e579146acfb..c2194e9179c 100644 --- a/test/MC/ARM/data-in-code.ll +++ b/test/MC/ARM/data-in-code.ll @@ -60,6 +60,23 @@ exit: ;; ARM-NEXT: Other: ;; ARM-NEXT: Section: [[MIXED_SECT]] +;; ARM: Symbol { +;; ARM: Name: $d +;; ARM-NEXT: Value: 0x0 +;; ARM-NEXT: Size: 0 +;; ARM-NEXT: Binding: Local (0x0) +;; ARM-NEXT: Type: None (0x0) +;; ARM-NEXT: Other: 0 +;; ARM-NEXT: Section: .ARM.exidx +;; ARM-NEXT: } + +;; ARM: Symbol { +;; ARM: Name: $d +;; ARM-NEXT: Value: 0 +;; ARM-NEXT: Size: 0 +;; ARM-NEXT: Binding: Local +;; ARM-NEXT: Type: None + ;; ARM-NOT: ${{[atd]}} ;; TMB: Symbol { diff --git a/test/MC/ARM/mappingsymbols.s b/test/MC/ARM/mappingsymbols.s deleted file mode 100644 index fff8e104781..00000000000 --- a/test/MC/ARM/mappingsymbols.s +++ /dev/null @@ -1,48 +0,0 @@ -# Check section containing code and data with permission executable for the section. -@ RUN: llvm-mc -triple armv7-none-linux -filetype=obj -o %t.o %p/Inputs/1.s -@ RUN: llvm-readobj -elf-output-style=GNU -symbols %t.o | FileCheck %s - -# Check section containing code and data with no permissions for the section. -@ RUN: llvm-mc -triple armv7-none-linux -filetype=obj -o %t.o %p/Inputs/2.s -@ RUN: llvm-readobj -elf-output-style=GNU -symbols %t.o | FileCheck %s - -# Check section containing code and data with read/write permissions for the section. -@ RUN: llvm-mc -triple armv7-none-linux -filetype=obj -o %t.o %p/Inputs/3.s -@ RUN: llvm-readobj -elf-output-style=GNU -symbols %t.o | FileCheck %s - -# Check section containing data with no permissions for the section. -@ RUN: llvm-mc -triple armv7-none-linux -filetype=obj -o %t.o %p/Inputs/4.s -@ RUN: llvm-readobj -elf-output-style=GNU -symbols %t.o | FileCheck %s -check-prefix=MAPPINGSYMBOLS - -# Check section containing only data with read/write permissions for the section. -@ RUN: llvm-mc -triple armv7-none-linux -filetype=obj -o %t.o %p/Inputs/5.s -@ RUN: llvm-readobj -elf-output-style=GNU -symbols %t.o | FileCheck %s -check-prefix=MAPPINGSYMBOLS - -# Check section containing the ident string with no permissions for the section. -@ RUN: llvm-mc -triple armv7-none-linux -filetype=obj -o %t.o %p/Inputs/ident.s -@ RUN: llvm-readobj -elf-output-style=GNU -symbols %t.o | FileCheck %s -check-prefix=MAPPINGSYMBOLS - -# Check section containing the attributes with no permissions for the section. -@ RUN: llvm-mc -triple armv7-none-linux -filetype=obj -o %t.o %p/Inputs/attr.s -@ RUN: llvm-readobj -elf-output-style=GNU -symbols %t.o | FileCheck %s -check-prefix=MAPPINGSYMBOLS - -# Check section containing code and data with no permissions for the section. -# data comes before code. -@ RUN: llvm-mc -triple armv7-none-linux -filetype=obj -o %t.o %p/Inputs/6.s -@ RUN: llvm-readobj -elf-output-style=GNU -symbols %t.o | FileCheck %s -check-prefix=MIX - -# Check section containing code and data with no permissions for the section. -# data comes before code. -@ RUN: llvm-mc -triple armv7-none-linux -filetype=obj -o %t.o %p/Inputs/7.s -@ RUN: llvm-readobj -elf-output-style=GNU -symbols %t.o | FileCheck %s - -#CHECK: $a -#CHECK: $d - -#MIX: $a -#MIX: $a -#MIX: $d -#MIX: $d - -#MAPPINGSYMBOLS-NOT: $a -#MAPPINGSYMBOLS-NOT: $d diff --git a/test/MC/ARM/multi-section-mapping.s b/test/MC/ARM/multi-section-mapping.s index e4b7146e4b0..2b1b0efab53 100644 --- a/test/MC/ARM/multi-section-mapping.s +++ b/test/MC/ARM/multi-section-mapping.s @@ -29,6 +29,7 @@ @ CHECK: 00000000 .text 00000000 $a @ CHECK-NEXT: 00000000 .wibble 00000000 $a +@ CHECK-NEXT: 00000000 .starts_data 00000000 $d @ CHECK-NEXT: 00000000 .starts_thumb 00000000 $t @ CHECK-NOT: ${{[adt]}} diff --git a/test/Object/ARM/nm-mapping-symbol.s b/test/Object/ARM/nm-mapping-symbol.s index 9b7b5b583ea..485c1cc39d7 100644 --- a/test/Object/ARM/nm-mapping-symbol.s +++ b/test/Object/ARM/nm-mapping-symbol.s @@ -9,4 +9,3 @@ .section .foobar,"",%progbits .asciz "foo" - nop -- 2.40.0