From f2f6b9cfe050bf47931f3d54967758c24de9fd59 Mon Sep 17 00:00:00 2001 From: Martin Storsjo Date: Wed, 25 Jul 2018 18:35:42 +0000 Subject: [PATCH] [COFF] Use comdat shared constants for MinGW as well GNU binutils tools have no problems with this kind of shared constants, provided that we actually hook it up completely in AsmPrinter and produce a global symbol. This effectively reverts SVN r335918 by hooking the rest of it up properly. This feature was implemented originally in SVN r213006, with no reason for why it can't be used for MinGW other than the fact that GCC doesn't do it while MSVC does. Differential Revision: https://reviews.llvm.org/D49646 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@337951 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/MC/MCAsmInfo.h | 5 ----- lib/CodeGen/AsmPrinter/AsmPrinter.cpp | 2 +- lib/CodeGen/TargetLoweringObjectFileImpl.cpp | 7 +------ lib/MC/MCAsmInfoCOFF.cpp | 8 -------- test/CodeGen/AArch64/win_cst_pool.ll | 11 +---------- test/CodeGen/X86/win_cst_pool.ll | 10 +--------- 6 files changed, 4 insertions(+), 39 deletions(-) diff --git a/include/llvm/MC/MCAsmInfo.h b/include/llvm/MC/MCAsmInfo.h index 120fb8fa749..0a0f37966fc 100644 --- a/include/llvm/MC/MCAsmInfo.h +++ b/include/llvm/MC/MCAsmInfo.h @@ -89,10 +89,6 @@ protected: /// them. bool HasCOFFAssociativeComdats = false; - /// True if this is a non-GNU COFF target. For GNU targets, we don't generate - /// constants into comdat sections. - bool HasCOFFComdatConstants = false; - /// This is the maximum possible length of an instruction, which is needed to /// compute the size of an inline asm. Defaults to 4. unsigned MaxInstLength = 4; @@ -473,7 +469,6 @@ public: bool hasMachoZeroFillDirective() const { return HasMachoZeroFillDirective; } bool hasMachoTBSSDirective() const { return HasMachoTBSSDirective; } bool hasCOFFAssociativeComdats() const { return HasCOFFAssociativeComdats; } - bool hasCOFFComdatConstants() const { return HasCOFFComdatConstants; } unsigned getMaxInstLength() const { return MaxInstLength; } unsigned getMinInstAlignment() const { return MinInstAlignment; } bool getDollarIsPC() const { return DollarIsPC; } diff --git a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp index 9bbc77b3056..f659282ac27 100644 --- a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -2664,7 +2664,7 @@ MCSymbol *AsmPrinter::GetBlockAddressSymbol(const BasicBlock *BB) const { /// GetCPISymbol - Return the symbol for the specified constant pool entry. MCSymbol *AsmPrinter::GetCPISymbol(unsigned CPID) const { - if (getSubtargetInfo().getTargetTriple().isKnownWindowsMSVCEnvironment()) { + if (getSubtargetInfo().getTargetTriple().isOSWindows()) { const MachineConstantPoolEntry &CPE = MF->getConstantPool()->getConstants()[CPID]; if (!CPE.isMachineConstantPoolEntry()) { diff --git a/lib/CodeGen/TargetLoweringObjectFileImpl.cpp b/lib/CodeGen/TargetLoweringObjectFileImpl.cpp index b5dd2d4cca8..149cec26411 100644 --- a/lib/CodeGen/TargetLoweringObjectFileImpl.cpp +++ b/lib/CodeGen/TargetLoweringObjectFileImpl.cpp @@ -1396,12 +1396,7 @@ static std::string scalarConstantToHexString(const Constant *C) { MCSection *TargetLoweringObjectFileCOFF::getSectionForConstant( const DataLayout &DL, SectionKind Kind, const Constant *C, unsigned &Align) const { - if (Kind.isMergeableConst() && C && - getContext().getAsmInfo()->hasCOFFComdatConstants()) { - // This creates comdat sections with the given symbol name, but unless - // AsmPrinter::GetCPISymbol actually makes the symbol global, the symbol - // will be created with a null storage class, which makes GNU binutils - // error out. + if (Kind.isMergeableConst() && C) { const unsigned Characteristics = COFF::IMAGE_SCN_CNT_INITIALIZED_DATA | COFF::IMAGE_SCN_MEM_READ | COFF::IMAGE_SCN_LNK_COMDAT; diff --git a/lib/MC/MCAsmInfoCOFF.cpp b/lib/MC/MCAsmInfoCOFF.cpp index d8fb875b67c..8bb02c3f649 100644 --- a/lib/MC/MCAsmInfoCOFF.cpp +++ b/lib/MC/MCAsmInfoCOFF.cpp @@ -45,11 +45,6 @@ MCAsmInfoCOFF::MCAsmInfoCOFF() { // If this is a COFF target, assume that it supports associative comdats. It's // part of the spec. HasCOFFAssociativeComdats = true; - - // We can generate constants in comdat sections that can be shared, - // but in order not to create null typed symbols, we actually need to - // make them global symbols as well. - HasCOFFComdatConstants = true; } void MCAsmInfoMicrosoft::anchor() {} @@ -63,7 +58,4 @@ MCAsmInfoGNUCOFF::MCAsmInfoGNUCOFF() { // comdats for jump tables, unwind information, and other data associated with // a function. HasCOFFAssociativeComdats = false; - - // We don't create constants in comdat sections for MinGW. - HasCOFFComdatConstants = false; } diff --git a/test/CodeGen/AArch64/win_cst_pool.ll b/test/CodeGen/AArch64/win_cst_pool.ll index 5bcc9194c79..9e78702980c 100644 --- a/test/CodeGen/AArch64/win_cst_pool.ll +++ b/test/CodeGen/AArch64/win_cst_pool.ll @@ -1,5 +1,5 @@ ; RUN: llc < %s -mtriple=aarch64-win32-msvc | FileCheck %s -; RUN: llc < %s -mtriple=aarch64-win32-gnu | FileCheck -check-prefix=MINGW %s +; RUN: llc < %s -mtriple=aarch64-win32-gnu | FileCheck %s define double @double() { ret double 0x0000000000800000 @@ -13,12 +13,3 @@ define double @double() { ; CHECK: adrp x8, __real@0000000000800000 ; CHECK-NEXT: ldr d0, [x8, __real@0000000000800000] ; CHECK-NEXT: ret - -; MINGW: .section .rdata,"dr" -; MINGW-NEXT: .p2align 3 -; MINGW-NEXT: [[LABEL:\.LC.*]]: -; MINGW-NEXT: .xword 8388608 -; MINGW: double: -; MINGW: adrp x8, [[LABEL]] -; MINGW-NEXT: ldr d0, [x8, [[LABEL]]] -; MINGW-NEXT: ret diff --git a/test/CodeGen/X86/win_cst_pool.ll b/test/CodeGen/X86/win_cst_pool.ll index cf0aa9bccd9..30762e9621d 100644 --- a/test/CodeGen/X86/win_cst_pool.ll +++ b/test/CodeGen/X86/win_cst_pool.ll @@ -1,5 +1,5 @@ ; RUN: llc < %s -mtriple=x86_64-win32 -mattr=sse2 -mattr=avx | FileCheck %s -; RUN: llc < %s -mtriple=x86_64-win32-gnu -mattr=sse2 -mattr=avx | FileCheck -check-prefix=MINGW %s +; RUN: llc < %s -mtriple=x86_64-win32-gnu -mattr=sse2 -mattr=avx | FileCheck %s target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-pc-windows-msvc" @@ -15,14 +15,6 @@ define double @double() { ; CHECK: movsd __real@0000000000800000(%rip), %xmm0 ; CHECK-NEXT: ret -; MINGW: .section .rdata,"dr" -; MINGW-NEXT: .p2align 3 -; MINGW-NEXT: [[LABEL:\.LC.*]]: -; MINGW-NEXT: .quad 8388608 -; MINGW: double: -; MINGW: movsd [[LABEL]](%rip), %xmm0 -; MINGW-NEXT: ret - define <4 x i32> @vec1() { ret <4 x i32> } -- 2.50.1