1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-24 03:33:20 +01:00

[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

llvm-svn: 337951
This commit is contained in:
Martin Storsjo 2018-07-25 18:35:42 +00:00
parent 95f7050678
commit 5832f5f2e4
6 changed files with 4 additions and 39 deletions

View File

@ -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; }

View File

@ -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()) {

View File

@ -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;

View File

@ -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;
}

View File

@ -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

View File

@ -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> <i32 3, i32 2, i32 1, i32 0>
}