2017-02-11 08:27:28 +08:00
|
|
|
//===- MCAsmInfoCOFF.cpp - COFF asm properties ----------------------------===//
|
2009-07-28 00:45:59 +08:00
|
|
|
//
|
|
|
|
// The LLVM Compiler Infrastructure
|
|
|
|
//
|
|
|
|
// This file is distributed under the University of Illinois Open Source
|
|
|
|
// License. See LICENSE.TXT for details.
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
//
|
|
|
|
// This file defines target asm properties related what form asm statements
|
|
|
|
// should take in general on COFF-based targets
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
2009-08-23 04:48:53 +08:00
|
|
|
#include "llvm/MC/MCAsmInfoCOFF.h"
|
2017-02-11 08:27:28 +08:00
|
|
|
#include "llvm/MC/MCDirectives.h"
|
|
|
|
|
2009-07-28 00:45:59 +08:00
|
|
|
using namespace llvm;
|
|
|
|
|
2017-02-11 08:27:28 +08:00
|
|
|
void MCAsmInfoCOFF::anchor() {}
|
2011-12-20 10:50:00 +08:00
|
|
|
|
2010-01-20 14:34:14 +08:00
|
|
|
MCAsmInfoCOFF::MCAsmInfoCOFF() {
|
2012-09-08 05:08:01 +08:00
|
|
|
// MingW 4.5 and later support .comm with log2 alignment, but .lcomm uses byte
|
|
|
|
// alignment.
|
|
|
|
COMMDirectiveAlignmentIsInBytes = false;
|
|
|
|
LCOMMDirectiveAlignmentType = LCOMM::ByteAlignment;
|
2009-07-28 00:45:59 +08:00
|
|
|
HasDotTypeDotSizeDirective = false;
|
|
|
|
HasSingleParameterDotFile = false;
|
|
|
|
WeakRefDirective = "\t.weak\t";
|
2013-12-03 07:04:51 +08:00
|
|
|
HasLinkOnceDirective = true;
|
2012-05-11 09:41:30 +08:00
|
|
|
|
2010-01-23 14:53:23 +08:00
|
|
|
// Doesn't support visibility:
|
2011-09-23 08:13:02 +08:00
|
|
|
HiddenVisibilityAttr = HiddenDeclarationVisibilityAttr = MCSA_Invalid;
|
|
|
|
ProtectedVisibilityAttr = MCSA_Invalid;
|
2009-07-28 00:45:59 +08:00
|
|
|
|
|
|
|
// Set up DWARF directives
|
|
|
|
SupportsDebugInformation = true;
|
2013-04-23 06:49:11 +08:00
|
|
|
NeedsDwarfSectionOffsetDirective = true;
|
2014-02-13 22:44:26 +08:00
|
|
|
|
|
|
|
UseIntegratedAssembler = true;
|
2015-04-28 09:37:11 +08:00
|
|
|
|
2015-11-11 08:51:36 +08:00
|
|
|
// At least MSVC inline-asm does AShr.
|
2015-04-28 09:37:11 +08:00
|
|
|
UseLogicalShr = false;
|
[mingw] Fix GCC ABI compatibility for comdat things
Summary:
GCC and the binutils COFF linker do comdats differently from MSVC.
If we want to be ABI compatible, we have to do what they do, which is to
emit unique section names like ".text$_Z3foov" instead of short section
names like ".text". Otherwise, the binutils linker gets confused and
reports multiple definition errors when two object files from GCC and
Clang containing the same inline function are linked together.
The best description of the issue is probably at
https://github.com/Alexpux/MINGW-packages/issues/1677, we don't seem to
have a good one in our tracker.
I fixed up the .pdata and .xdata sections needed everywhere other than
32-bit x86. GCC doesn't use associative comdats for those, it appears to
rely on the section name.
Reviewers: smeenai, compnerd, mstorsjo, martell, mati865
Subscribers: llvm-commits, hiraditya
Differential Revision: https://reviews.llvm.org/D48402
llvm-svn: 335286
2018-06-22 04:27:38 +08:00
|
|
|
|
|
|
|
// If this is a COFF target, assume that it supports associative comdats. It's
|
|
|
|
// part of the spec.
|
|
|
|
HasCOFFAssociativeComdats = true;
|
2009-07-28 00:45:59 +08:00
|
|
|
}
|
2011-11-30 02:00:06 +08:00
|
|
|
|
2017-02-11 08:27:28 +08:00
|
|
|
void MCAsmInfoMicrosoft::anchor() {}
|
2011-11-30 02:00:06 +08:00
|
|
|
|
2017-02-11 08:27:28 +08:00
|
|
|
MCAsmInfoMicrosoft::MCAsmInfoMicrosoft() = default;
|
2011-12-20 10:50:00 +08:00
|
|
|
|
2017-02-11 08:27:28 +08:00
|
|
|
void MCAsmInfoGNUCOFF::anchor() {}
|
2011-11-30 02:00:06 +08:00
|
|
|
|
[mingw] Fix GCC ABI compatibility for comdat things
Summary:
GCC and the binutils COFF linker do comdats differently from MSVC.
If we want to be ABI compatible, we have to do what they do, which is to
emit unique section names like ".text$_Z3foov" instead of short section
names like ".text". Otherwise, the binutils linker gets confused and
reports multiple definition errors when two object files from GCC and
Clang containing the same inline function are linked together.
The best description of the issue is probably at
https://github.com/Alexpux/MINGW-packages/issues/1677, we don't seem to
have a good one in our tracker.
I fixed up the .pdata and .xdata sections needed everywhere other than
32-bit x86. GCC doesn't use associative comdats for those, it appears to
rely on the section name.
Reviewers: smeenai, compnerd, mstorsjo, martell, mati865
Subscribers: llvm-commits, hiraditya
Differential Revision: https://reviews.llvm.org/D48402
llvm-svn: 335286
2018-06-22 04:27:38 +08:00
|
|
|
MCAsmInfoGNUCOFF::MCAsmInfoGNUCOFF() {
|
|
|
|
// If this is a GNU environment (mingw or cygwin), don't use associative
|
|
|
|
// comdats for jump tables, unwind information, and other data associated with
|
|
|
|
// a function.
|
|
|
|
HasCOFFAssociativeComdats = false;
|
|
|
|
}
|