mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +01:00
fb13e8ff55
Summary: This fixes a dumpbin warning on objects produced by the MC assembler when starting from text. All .debug$S sections are supposed to be marked IMAGE_SCN_MEM_DISCARDABLE. The main, non-COMDAT .debug$S section had this set, but any comdat ones were not being marked discardable because there was no .section flag for it. This change does two things: - If the section name starts with .debug, implicitly mark the section as discardable. This means we do the same thing as gas on .s files with DWARF from GCC, which is important. - Adds the 'D' flag to the .section directive on COFF to explicitly say a section is discardable. We only emit this flag if the section name does not start with .debug. This allows the user to explicitly tweak their section flags without worrying about magic section names. The only thing you can't do in this scheme is to create a non-discardable section with a name starting with ".debug", but hopefully users don't need that. Reviewers: majnemer, rafael Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D24582 llvm-svn: 281554
113 lines
3.4 KiB
C++
113 lines
3.4 KiB
C++
//===- lib/MC/MCSectionCOFF.cpp - COFF Code Section Representation --------===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/MC/MCSectionCOFF.h"
|
|
#include "llvm/MC/MCAsmInfo.h"
|
|
#include "llvm/MC/MCContext.h"
|
|
#include "llvm/MC/MCSymbol.h"
|
|
#include "llvm/Support/COFF.h"
|
|
#include "llvm/Support/raw_ostream.h"
|
|
using namespace llvm;
|
|
|
|
MCSectionCOFF::~MCSectionCOFF() {} // anchor.
|
|
|
|
// ShouldOmitSectionDirective - Decides whether a '.section' directive
|
|
// should be printed before the section name
|
|
bool MCSectionCOFF::ShouldOmitSectionDirective(StringRef Name,
|
|
const MCAsmInfo &MAI) const {
|
|
if (COMDATSymbol)
|
|
return false;
|
|
|
|
// FIXME: Does .section .bss/.data/.text work everywhere??
|
|
if (Name == ".text" || Name == ".data" || Name == ".bss")
|
|
return true;
|
|
|
|
return false;
|
|
}
|
|
|
|
void MCSectionCOFF::setSelection(int Selection) const {
|
|
assert(Selection != 0 && "invalid COMDAT selection type");
|
|
this->Selection = Selection;
|
|
Characteristics |= COFF::IMAGE_SCN_LNK_COMDAT;
|
|
}
|
|
|
|
void MCSectionCOFF::PrintSwitchToSection(const MCAsmInfo &MAI,
|
|
raw_ostream &OS,
|
|
const MCExpr *Subsection) const {
|
|
|
|
// standard sections don't require the '.section'
|
|
if (ShouldOmitSectionDirective(SectionName, MAI)) {
|
|
OS << '\t' << getSectionName() << '\n';
|
|
return;
|
|
}
|
|
|
|
OS << "\t.section\t" << getSectionName() << ",\"";
|
|
if (getCharacteristics() & COFF::IMAGE_SCN_CNT_INITIALIZED_DATA)
|
|
OS << 'd';
|
|
if (getCharacteristics() & COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA)
|
|
OS << 'b';
|
|
if (getCharacteristics() & COFF::IMAGE_SCN_MEM_EXECUTE)
|
|
OS << 'x';
|
|
if (getCharacteristics() & COFF::IMAGE_SCN_MEM_WRITE)
|
|
OS << 'w';
|
|
else if (getCharacteristics() & COFF::IMAGE_SCN_MEM_READ)
|
|
OS << 'r';
|
|
else
|
|
OS << 'y';
|
|
if (getCharacteristics() & COFF::IMAGE_SCN_LNK_REMOVE)
|
|
OS << 'n';
|
|
if (getCharacteristics() & COFF::IMAGE_SCN_MEM_SHARED)
|
|
OS << 's';
|
|
if ((getCharacteristics() & COFF::IMAGE_SCN_MEM_DISCARDABLE) &&
|
|
!isImplicitlyDiscardable(SectionName))
|
|
OS << 'D';
|
|
OS << '"';
|
|
|
|
if (getCharacteristics() & COFF::IMAGE_SCN_LNK_COMDAT) {
|
|
OS << ",";
|
|
switch (Selection) {
|
|
case COFF::IMAGE_COMDAT_SELECT_NODUPLICATES:
|
|
OS << "one_only,";
|
|
break;
|
|
case COFF::IMAGE_COMDAT_SELECT_ANY:
|
|
OS << "discard,";
|
|
break;
|
|
case COFF::IMAGE_COMDAT_SELECT_SAME_SIZE:
|
|
OS << "same_size,";
|
|
break;
|
|
case COFF::IMAGE_COMDAT_SELECT_EXACT_MATCH:
|
|
OS << "same_contents,";
|
|
break;
|
|
case COFF::IMAGE_COMDAT_SELECT_ASSOCIATIVE:
|
|
OS << "associative,";
|
|
break;
|
|
case COFF::IMAGE_COMDAT_SELECT_LARGEST:
|
|
OS << "largest,";
|
|
break;
|
|
case COFF::IMAGE_COMDAT_SELECT_NEWEST:
|
|
OS << "newest,";
|
|
break;
|
|
default:
|
|
assert (0 && "unsupported COFF selection type");
|
|
break;
|
|
}
|
|
assert(COMDATSymbol);
|
|
COMDATSymbol->print(OS, &MAI);
|
|
}
|
|
OS << '\n';
|
|
}
|
|
|
|
bool MCSectionCOFF::UseCodeAlign() const {
|
|
return getKind().isText();
|
|
}
|
|
|
|
bool MCSectionCOFF::isVirtualSection() const {
|
|
return getCharacteristics() & COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA;
|
|
}
|