[llvm] r335336 - Recommit r335333 "[MC] - Add .stack_size sections into groups and link them with .text"
George Rimar via llvm-commits
llvm-commits at lists.llvm.org
Fri Jun 22 03:53:47 PDT 2018
Author: grimar
Date: Fri Jun 22 03:53:47 2018
New Revision: 335336
URL: http://llvm.org/viewvc/llvm-project?rev=335336&view=rev
Log:
Recommit r335333 "[MC] - Add .stack_size sections into groups and link them with .text"
With compilation fix.
Original commit message:
D39788 added a '.stack-size' section containing metadata on function stack sizes
to output ELF files behind the new -stack-size-section flag.
This change does following two things on top:
1) Imagine the case when there are -ffunction-sections flag given and there are text sections in COMDATs.
The patch adds a '.stack-size' section into corresponding COMDAT group, so that linker will be able to
eliminate them fast during resolving the COMDATs.
2) Patch sets a SHF_LINK_ORDER flag and links '.stack-size' with the corresponding .text.
With that linker will be able to do -gc-sections on dead stack sizes sections.
Differential revision: https://reviews.llvm.org/D46874
Added:
llvm/trunk/test/CodeGen/X86/stack-size-section-function-sections.ll
- copied unchanged from r335332, llvm/trunk/test/CodeGen/X86/stack-size-section-function-sections.ll
Modified:
llvm/trunk/include/llvm/MC/MCObjectFileInfo.h
llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
llvm/trunk/lib/MC/MCObjectFileInfo.cpp
llvm/trunk/test/CodeGen/ARM/stack-size-section.ll
llvm/trunk/test/CodeGen/SystemZ/stack-size-section.ll
llvm/trunk/test/CodeGen/X86/stack-size-section.ll
Modified: llvm/trunk/include/llvm/MC/MCObjectFileInfo.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCObjectFileInfo.h?rev=335336&r1=335335&r2=335336&view=diff
==============================================================================
--- llvm/trunk/include/llvm/MC/MCObjectFileInfo.h (original)
+++ llvm/trunk/include/llvm/MC/MCObjectFileInfo.h Fri Jun 22 03:53:47 2018
@@ -14,7 +14,9 @@
#ifndef LLVM_MC_MCOBJECTFILEINFO_H
#define LLVM_MC_MCOBJECTFILEINFO_H
+#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/Triple.h"
+#include "llvm/MC/MCSymbol.h"
#include "llvm/Support/CodeGen.h"
namespace llvm {
@@ -158,6 +160,7 @@ protected:
/// Section containing metadata on function stack sizes.
MCSection *StackSizesSection;
+ mutable DenseMap<const MCSymbol *, unsigned> StackSizesUniquing;
// ELF specific sections.
MCSection *DataRelROSection;
@@ -299,7 +302,7 @@ public:
MCSection *getStackMapSection() const { return StackMapSection; }
MCSection *getFaultMapSection() const { return FaultMapSection; }
- MCSection *getStackSizesSection() const { return StackSizesSection; }
+ MCSection *getStackSizesSection(const MCSection &TextSec) const;
// ELF specific sections.
MCSection *getDataRelROSection() const { return DataRelROSection; }
Modified: llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp?rev=335336&r1=335335&r2=335336&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp (original)
+++ llvm/trunk/lib/CodeGen/AsmPrinter/AsmPrinter.cpp Fri Jun 22 03:53:47 2018
@@ -989,7 +989,8 @@ void AsmPrinter::emitStackSizeSection(co
if (!MF.getTarget().Options.EmitStackSizeSection)
return;
- MCSection *StackSizeSection = getObjFileLowering().getStackSizesSection();
+ MCSection *StackSizeSection =
+ getObjFileLowering().getStackSizesSection(*getCurrentSection());
if (!StackSizeSection)
return;
Modified: llvm/trunk/lib/MC/MCObjectFileInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCObjectFileInfo.cpp?rev=335336&r1=335335&r2=335336&view=diff
==============================================================================
--- llvm/trunk/lib/MC/MCObjectFileInfo.cpp (original)
+++ llvm/trunk/lib/MC/MCObjectFileInfo.cpp Fri Jun 22 03:53:47 2018
@@ -948,3 +948,24 @@ MCSection *MCObjectFileInfo::getDwarfTyp
return Ctx->getELFSection(".debug_types", ELF::SHT_PROGBITS, ELF::SHF_GROUP,
0, utostr(Hash));
}
+
+MCSection *
+MCObjectFileInfo::getStackSizesSection(const MCSection &TextSec) const {
+ if (Env != IsELF)
+ return StackSizesSection;
+
+ const MCSectionELF &ElfSec = static_cast<const MCSectionELF &>(TextSec);
+ unsigned Flags = ELF::SHF_LINK_ORDER;
+ StringRef GroupName;
+ if (const MCSymbol *Group = ElfSec.getGroup()) {
+ GroupName = Group->getName();
+ Flags |= ELF::SHF_GROUP;
+ }
+
+ const MCSymbol *Link = TextSec.getBeginSymbol();
+ auto It = StackSizesUniquing.insert({Link, StackSizesUniquing.size()});
+ unsigned UniqueID = It.first->second;
+
+ return Ctx->getELFSection(".stack_sizes", ELF::SHT_PROGBITS, Flags, 0,
+ GroupName, UniqueID, cast<MCSymbolELF>(Link));
+}
Modified: llvm/trunk/test/CodeGen/ARM/stack-size-section.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/ARM/stack-size-section.ll?rev=335336&r1=335335&r2=335336&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/ARM/stack-size-section.ll (original)
+++ llvm/trunk/test/CodeGen/ARM/stack-size-section.ll Fri Jun 22 03:53:47 2018
@@ -2,7 +2,7 @@
; CHECK-LABEL: func1:
; CHECK-NEXT: .Lfunc_begin0:
-; CHECK: .section .stack_sizes,"",%progbits
+; CHECK: .section .stack_sizes,"o",%progbits,.text,unique,0
; CHECK-NEXT: .long .Lfunc_begin0
; CHECK-NEXT: .byte 8
define void @func1(i32, i32) #0 {
@@ -13,7 +13,7 @@ define void @func1(i32, i32) #0 {
; CHECK-LABEL: func2:
; CHECK-NEXT: .Lfunc_begin1:
-; CHECK: .section .stack_sizes,"",%progbits
+; CHECK: .section .stack_sizes,"o",%progbits,.text,unique,0
; CHECK-NEXT: .long .Lfunc_begin1
; CHECK-NEXT: .byte 16
define void @func2() #0 {
Modified: llvm/trunk/test/CodeGen/SystemZ/stack-size-section.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/SystemZ/stack-size-section.ll?rev=335336&r1=335335&r2=335336&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/SystemZ/stack-size-section.ll (original)
+++ llvm/trunk/test/CodeGen/SystemZ/stack-size-section.ll Fri Jun 22 03:53:47 2018
@@ -2,7 +2,7 @@
; CHECK-LABEL: func1:
; CHECK-NEXT: .Lfunc_begin0:
-; CHECK: .section .stack_sizes,"", at progbits
+; CHECK: .section .stack_sizes,"o", at progbits,.text,unique,0
; CHECK-NEXT: .quad .Lfunc_begin0
; CHECK-NEXT: .byte 0
define void @func1(i32, i32) #0 {
@@ -11,7 +11,7 @@ define void @func1(i32, i32) #0 {
; CHECK-LABEL: func2:
; CHECK-NEXT: .Lfunc_begin1:
-; CHECK: .section .stack_sizes,"", at progbits
+; CHECK: .section .stack_sizes,"o", at progbits,.text,unique,0
; CHECK-NEXT: .quad .Lfunc_begin1
; CHECK-NEXT: .ascii "\250\001"
define void @func2(i32, i32) #0 {
@@ -22,7 +22,7 @@ define void @func2(i32, i32) #0 {
; CHECK-LABEL: func3:
; CHECK-NEXT: .Lfunc_begin2:
-; CHECK: .section .stack_sizes,"", at progbits
+; CHECK: .section .stack_sizes,"o", at progbits,.text,unique,0
; CHECK-NEXT: .quad .Lfunc_begin2
; CHECK-NEXT: .ascii "\250\001"
define void @func3() #0 {
Modified: llvm/trunk/test/CodeGen/X86/stack-size-section.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CodeGen/X86/stack-size-section.ll?rev=335336&r1=335335&r2=335336&view=diff
==============================================================================
--- llvm/trunk/test/CodeGen/X86/stack-size-section.ll (original)
+++ llvm/trunk/test/CodeGen/X86/stack-size-section.ll Fri Jun 22 03:53:47 2018
@@ -2,7 +2,7 @@
; CHECK-LABEL: func1:
; CHECK-NEXT: .Lfunc_begin0:
-; CHECK: .section .stack_sizes,"", at progbits
+; CHECK: .section .stack_sizes,"o", at progbits
; CHECK-NEXT: .quad .Lfunc_begin0
; CHECK-NEXT: .byte 8
define void @func1(i32, i32) #0 {
@@ -13,7 +13,7 @@ define void @func1(i32, i32) #0 {
; CHECK-LABEL: func2:
; CHECK-NEXT: .Lfunc_begin1:
-; CHECK: .section .stack_sizes,"", at progbits
+; CHECK: .section .stack_sizes,"o", at progbits
; CHECK-NEXT: .quad .Lfunc_begin1
; CHECK-NEXT: .byte 24
define void @func2() #0 {
@@ -22,6 +22,23 @@ define void @func2() #0 {
ret void
}
+; Check that we still put .stack_sizes into the corresponding COMDAT group if any.
+; CHECK: .section .text._Z4fooTIiET_v,"axG", at progbits,_Z4fooTIiET_v,comdat
+; CHECK: .section .stack_sizes,"Go", at progbits,_Z4fooTIiET_v,comdat,.text._Z4fooTIiET_v,unique,1
+$_Z4fooTIiET_v = comdat any
+define linkonce_odr dso_local i32 @_Z4fooTIiET_v() comdat {
+ ret i32 0
+}
+
+; Check that we assign a unique ID to .stack_sizes if it is linked with a unique .text section.
+; CHECK: .section .text.func3,"ax", at progbits
+; CHECK: .section .stack_sizes,"o", at progbits,.text.func3,unique,2
+define dso_local i32 @func3() section ".text.func3" {
+ %1 = alloca i32, align 4
+ store i32 0, i32* %1, align 4
+ ret i32 0
+}
+
; CHECK-LABEL: dynalloc:
; CHECK-NOT: .section .stack_sizes
define void @dynalloc(i32 %N) #0 {
More information about the llvm-commits
mailing list