move the various directive enums out of the MCStreamer class

into a new MCDirectives.h file.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@94294 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2010-01-23 06:39:22 +00:00
parent 52492ac0d0
commit a5ad93a10a
12 changed files with 126 additions and 116 deletions

View File

@ -0,0 +1,44 @@
//===- MCDirectives.h - Enums for directives on various targets -*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file defines various enums that represent target-specific directives.
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_MC_MCDIRECTIVES_H
#define LLVM_MC_MCDIRECTIVES_H
namespace llvm {
enum MCSymbolAttr {
MCSA_Invalid = 0, /// Not a valid directive.
// Various directives in alphabetical order.
MCSA_Global, /// .globl
MCSA_Hidden, /// .hidden (ELF)
MCSA_IndirectSymbol, /// .indirect_symbol (MachO)
MCSA_Internal, /// .internal (ELF)
MCSA_LazyReference, /// .lazy_reference (MachO)
MCSA_Local, /// .local (ELF)
MCSA_NoDeadStrip, /// .no_dead_strip (MachO)
MCSA_PrivateExtern, /// .private_extern (MachO)
MCSA_Protected, /// .protected (ELF)
MCSA_Reference, /// .reference (MachO)
MCSA_Weak, /// .weak
MCSA_WeakDefinition, /// .weak_definition (MachO)
MCSA_WeakReference /// .weak_reference (MachO)
};
enum MCAssemblerFlag {
MCAF_SubsectionsViaSymbols /// .subsections_via_symbols (MachO)
};
} // end namespace llvm
#endif

View File

@ -144,7 +144,7 @@ private:
/// ParseDirectiveSymbolAttribute - Parse a directive like ".globl" which
/// accepts a single symbol (which should be a label or an external).
bool ParseDirectiveSymbolAttribute(MCStreamer::SymbolAttr Attr);
bool ParseDirectiveSymbolAttribute(MCSymbolAttr Attr);
bool ParseDirectiveDarwinSymbolDesc(); // Darwin specific ".desc"
bool ParseDirectiveDarwinLsym(); // Darwin specific ".lsym"

View File

@ -15,6 +15,7 @@
#define LLVM_MC_MCSTREAMER_H
#include "llvm/System/DataTypes.h"
#include "llvm/MC/MCDirectives.h"
namespace llvm {
class MCAsmInfo;
@ -40,31 +41,6 @@ namespace llvm {
/// a .s file, and implementations that write out .o files of various formats.
///
class MCStreamer {
public:
enum SymbolAttr {
Global, /// .globl
Hidden, /// .hidden (ELF)
IndirectSymbol, /// .indirect_symbol (Apple)
Internal, /// .internal (ELF)
LazyReference, /// .lazy_reference (Apple)
Local, /// .local (ELF)
NoDeadStrip, /// .no_dead_strip (Apple)
PrivateExtern, /// .private_extern (Apple)
Protected, /// .protected (ELF)
Reference, /// .reference (Apple)
Weak, /// .weak
WeakDefinition, /// .weak_definition (Apple)
WeakReference, /// .weak_reference (Apple)
SymbolAttrFirst = Global,
SymbolAttrLast = WeakReference
};
enum AssemblerFlag {
SubsectionsViaSymbols /// .subsections_via_symbols (Apple)
};
private:
MCContext &Context;
MCStreamer(const MCStreamer&); // DO NOT IMPLEMENT
@ -128,7 +104,7 @@ namespace llvm {
virtual void EmitLabel(MCSymbol *Symbol) = 0;
/// EmitAssemblerFlag - Note in the output the specified @param Flag
virtual void EmitAssemblerFlag(AssemblerFlag Flag) = 0;
virtual void EmitAssemblerFlag(MCAssemblerFlag Flag) = 0;
/// EmitAssignment - Emit an assignment of @param Value to @param Symbol.
///
@ -145,7 +121,7 @@ namespace llvm {
/// EmitSymbolAttribute - Add the given @param Attribute to @param Symbol.
virtual void EmitSymbolAttribute(MCSymbol *Symbol,
SymbolAttr Attribute) = 0;
MCSymbolAttr Attribute) = 0;
/// EmitSymbolDesc - Set the @param DescValue for the @param Symbol.
///

View File

@ -203,7 +203,7 @@ void AsmPrinter::EmitGlobalVariable(const GlobalVariable *GV) {
}
// .local _foo
OutStreamer.EmitSymbolAttribute(GVSym, MCStreamer::Local);
OutStreamer.EmitSymbolAttribute(GVSym, MCSA_Local);
// .comm _foo, 42, 4
OutStreamer.EmitCommonSymbol(GVSym, Size, 1 << AlignLog);
return;
@ -216,7 +216,7 @@ void AsmPrinter::EmitGlobalVariable(const GlobalVariable *GV) {
// emission.
if (GVKind.isBSSExtern() && MAI->hasMachoZeroFillDirective()) {
// .globl _foo
OutStreamer.EmitSymbolAttribute(GVSym, MCStreamer::Global);
OutStreamer.EmitSymbolAttribute(GVSym, MCSA_Global);
// .zerofill __DATA, __common, _foo, 400, 5
OutStreamer.EmitZerofill(TheSection, GVSym, Size, 1 << AlignLog);
return;
@ -235,17 +235,17 @@ void AsmPrinter::EmitGlobalVariable(const GlobalVariable *GV) {
case GlobalValue::LinkerPrivateLinkage:
if (MAI->getWeakDefDirective() != 0) {
// .globl _foo
OutStreamer.EmitSymbolAttribute(GVSym, MCStreamer::Global);
OutStreamer.EmitSymbolAttribute(GVSym, MCSA_Global);
// .weak_definition _foo
OutStreamer.EmitSymbolAttribute(GVSym, MCStreamer::WeakDefinition);
OutStreamer.EmitSymbolAttribute(GVSym, MCSA_WeakDefinition);
} else if (const char *LinkOnce = MAI->getLinkOnceDirective()) {
// .globl _foo
OutStreamer.EmitSymbolAttribute(GVSym, MCStreamer::Global);
OutStreamer.EmitSymbolAttribute(GVSym, MCSA_Global);
// .linkonce same_size
O << LinkOnce;
} else {
// .weak _foo
OutStreamer.EmitSymbolAttribute(GVSym, MCStreamer::Weak);
OutStreamer.EmitSymbolAttribute(GVSym, MCSA_Weak);
}
break;
case GlobalValue::DLLExportLinkage:
@ -255,7 +255,7 @@ void AsmPrinter::EmitGlobalVariable(const GlobalVariable *GV) {
case GlobalValue::ExternalLinkage:
// If external or appending, declare as a global symbol.
// .globl _foo
OutStreamer.EmitSymbolAttribute(GVSym, MCStreamer::Global);
OutStreamer.EmitSymbolAttribute(GVSym, MCSA_Global);
break;
case GlobalValue::PrivateLinkage:
case GlobalValue::InternalLinkage:
@ -303,13 +303,13 @@ bool AsmPrinter::doFinalization(Module &M) {
I != E; ++I) {
if (!I->hasExternalWeakLinkage()) continue;
OutStreamer.EmitSymbolAttribute(GetGlobalValueSymbol(I),
MCStreamer::WeakReference);
MCSA_WeakReference);
}
for (Module::const_iterator I = M.begin(), E = M.end(); I != E; ++I) {
if (!I->hasExternalWeakLinkage()) continue;
OutStreamer.EmitSymbolAttribute(GetGlobalValueSymbol(I),
MCStreamer::WeakReference);
MCSA_WeakReference);
}
}
@ -323,9 +323,9 @@ bool AsmPrinter::doFinalization(Module &M) {
MCSymbol *Target = GetGlobalValueSymbol(GV);
if (I->hasExternalLinkage() || !MAI->getWeakRefDirective())
OutStreamer.EmitSymbolAttribute(Name, MCStreamer::Global);
OutStreamer.EmitSymbolAttribute(Name, MCSA_Global);
else if (I->hasWeakLinkage())
OutStreamer.EmitSymbolAttribute(Name, MCStreamer::WeakReference);
OutStreamer.EmitSymbolAttribute(Name, MCSA_WeakReference);
else
assert(I->hasLocalLinkage() && "Invalid alias linkage");
@ -601,7 +601,7 @@ bool AsmPrinter::EmitSpecialLLVMGlobal(const GlobalVariable *GV) {
MAI->hasStaticCtorDtorReferenceInStaticMode()) {
StringRef Sym(".constructors_used");
OutStreamer.EmitSymbolAttribute(OutContext.GetOrCreateSymbol(Sym),
MCStreamer::Reference);
MCSA_Reference);
}
return true;
}
@ -615,7 +615,7 @@ bool AsmPrinter::EmitSpecialLLVMGlobal(const GlobalVariable *GV) {
MAI->hasStaticCtorDtorReferenceInStaticMode()) {
StringRef Sym(".destructors_used");
OutStreamer.EmitSymbolAttribute(OutContext.GetOrCreateSymbol(Sym),
MCStreamer::Reference);
MCSA_Reference);
}
return true;
}
@ -636,7 +636,7 @@ void AsmPrinter::EmitLLVMUsedList(Constant *List) {
dyn_cast<GlobalValue>(InitList->getOperand(i)->stripPointerCasts());
if (GV && getObjFileLowering().shouldEmitUsedDirectiveFor(GV, Mang))
OutStreamer.EmitSymbolAttribute(GetGlobalValueSymbol(GV),
MCStreamer::NoDeadStrip);
MCSA_NoDeadStrip);
}
}

View File

@ -247,7 +247,7 @@ void DwarfException::EmitFDE(const FunctionEHFrameInfo &EHFrameInfo) {
// dead-stripping unconditionally.
if (MAI->hasNoDeadStrip())
Asm->OutStreamer.EmitSymbolAttribute(EHFrameInfo.FunctionEHSym,
MCStreamer::NoDeadStrip);
MCSA_NoDeadStrip);
} else {
O << *EHFrameInfo.FunctionEHSym << ":\n";
@ -316,7 +316,7 @@ void DwarfException::EmitFDE(const FunctionEHFrameInfo &EHFrameInfo) {
if (MMI->isUsedFunction(EHFrameInfo.function))
if (MAI->hasNoDeadStrip())
Asm->OutStreamer.EmitSymbolAttribute(EHFrameInfo.FunctionEHSym,
MCStreamer::NoDeadStrip);
MCSA_NoDeadStrip);
}
Asm->O << '\n';
}

View File

@ -85,11 +85,11 @@ public:
virtual void EmitLabel(MCSymbol *Symbol);
virtual void EmitAssemblerFlag(AssemblerFlag Flag);
virtual void EmitAssemblerFlag(MCAssemblerFlag Flag);
virtual void EmitAssignment(MCSymbol *Symbol, const MCExpr *Value);
virtual void EmitSymbolAttribute(MCSymbol *Symbol, SymbolAttr Attribute);
virtual void EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute);
virtual void EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue);
@ -195,10 +195,10 @@ void MCAsmStreamer::EmitLabel(MCSymbol *Symbol) {
Symbol->setSection(*CurSection);
}
void MCAsmStreamer::EmitAssemblerFlag(AssemblerFlag Flag) {
void MCAsmStreamer::EmitAssemblerFlag(MCAssemblerFlag Flag) {
switch (Flag) {
default: assert(0 && "Invalid flag!");
case SubsectionsViaSymbols: OS << ".subsections_via_symbols"; break;
case MCAF_SubsectionsViaSymbols: OS << ".subsections_via_symbols"; break;
}
EmitEOL();
}
@ -217,21 +217,23 @@ void MCAsmStreamer::EmitAssignment(MCSymbol *Symbol, const MCExpr *Value) {
}
void MCAsmStreamer::EmitSymbolAttribute(MCSymbol *Symbol,
SymbolAttr Attribute) {
MCSymbolAttr Attribute) {
switch (Attribute) {
case Global: OS << MAI.getGlobalDirective(); break; // .globl
case Hidden: OS << ".hidden "; break;
case IndirectSymbol: OS << ".indirect_symbol "; break;
case Internal: OS << ".internal "; break;
case LazyReference: OS << ".lazy_reference "; break;
case Local: OS << ".local "; break;
case NoDeadStrip: OS << ".no_dead_strip "; break;
case PrivateExtern: OS << ".private_extern "; break;
case Protected: OS << ".protected "; break;
case Reference: OS << ".reference "; break;
case Weak: OS << ".weak "; break;
case WeakDefinition: OS << ".weak_definition "; break;
case WeakReference: OS << MAI.getWeakRefDirective(); break;// .weak_reference
case MCSA_Invalid: assert(0 && "Invalid symbol attribute");
case MCSA_Global: OS << MAI.getGlobalDirective(); break; // .globl
case MCSA_Hidden: OS << ".hidden "; break;
case MCSA_IndirectSymbol: OS << ".indirect_symbol "; break;
case MCSA_Internal: OS << ".internal "; break;
case MCSA_LazyReference: OS << ".lazy_reference "; break;
case MCSA_Local: OS << ".local "; break;
case MCSA_NoDeadStrip: OS << ".no_dead_strip "; break;
case MCSA_PrivateExtern: OS << ".private_extern "; break;
case MCSA_Protected: OS << ".protected "; break;
case MCSA_Reference: OS << ".reference "; break;
case MCSA_Weak: OS << ".weak "; break;
case MCSA_WeakDefinition: OS << ".weak_definition "; break;
// .weak_reference
case MCSA_WeakReference: OS << MAI.getWeakRefDirective(); break;
}
OS << *Symbol;

View File

@ -117,36 +117,23 @@ public:
/// @{
virtual void SwitchSection(const MCSection *Section);
virtual void EmitLabel(MCSymbol *Symbol);
virtual void EmitAssemblerFlag(AssemblerFlag Flag);
virtual void EmitAssemblerFlag(MCAssemblerFlag Flag);
virtual void EmitAssignment(MCSymbol *Symbol, const MCExpr *Value);
virtual void EmitSymbolAttribute(MCSymbol *Symbol, SymbolAttr Attribute);
virtual void EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute);
virtual void EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue);
virtual void EmitCommonSymbol(MCSymbol *Symbol, unsigned Size,
unsigned ByteAlignment);
virtual void EmitZerofill(const MCSection *Section, MCSymbol *Symbol = 0,
unsigned Size = 0, unsigned ByteAlignment = 0);
virtual void EmitBytes(StringRef Data, unsigned AddrSpace);
virtual void EmitValue(const MCExpr *Value, unsigned Size,unsigned AddrSpace);
virtual void EmitValueToAlignment(unsigned ByteAlignment, int64_t Value = 0,
unsigned ValueSize = 1,
unsigned MaxBytesToEmit = 0);
virtual void EmitValueToOffset(const MCExpr *Offset,
unsigned char Value = 0);
virtual void EmitInstruction(const MCInst &Inst);
virtual void Finish();
/// @}
@ -183,9 +170,9 @@ void MCMachOStreamer::EmitLabel(MCSymbol *Symbol) {
Symbol->setSection(*CurSection);
}
void MCMachOStreamer::EmitAssemblerFlag(AssemblerFlag Flag) {
void MCMachOStreamer::EmitAssemblerFlag(MCAssemblerFlag Flag) {
switch (Flag) {
case SubsectionsViaSymbols:
case MCAF_SubsectionsViaSymbols:
Assembler.setSubsectionsViaSymbols(true);
return;
}
@ -204,10 +191,10 @@ void MCMachOStreamer::EmitAssignment(MCSymbol *Symbol, const MCExpr *Value) {
}
void MCMachOStreamer::EmitSymbolAttribute(MCSymbol *Symbol,
SymbolAttr Attribute) {
MCSymbolAttr Attribute) {
// Indirect symbols are handled differently, to match how 'as' handles
// them. This makes writing matching .o files easier.
if (Attribute == MCStreamer::IndirectSymbol) {
if (Attribute == MCSA_IndirectSymbol) {
// Note that we intentionally cannot use the symbol data here; this is
// important for matching the string table that 'as' generates.
IndirectSymbolData ISD;
@ -229,20 +216,21 @@ void MCMachOStreamer::EmitSymbolAttribute(MCSymbol *Symbol,
// In the future it might be worth trying to make these operations more well
// defined.
switch (Attribute) {
case MCStreamer::IndirectSymbol:
case MCStreamer::Hidden:
case MCStreamer::Internal:
case MCStreamer::Protected:
case MCStreamer::Weak:
case MCStreamer::Local:
case MCSA_Invalid:
case MCSA_IndirectSymbol:
case MCSA_Hidden:
case MCSA_Internal:
case MCSA_Protected:
case MCSA_Weak:
case MCSA_Local:
assert(0 && "Invalid symbol attribute for Mach-O!");
break;
case MCStreamer::Global:
case MCSA_Global:
SD.setExternal(true);
break;
case MCStreamer::LazyReference:
case MCSA_LazyReference:
// FIXME: This requires -dynamic.
SD.setFlags(SD.getFlags() | SF_NoDeadStrip);
if (Symbol->isUndefined())
@ -251,23 +239,23 @@ void MCMachOStreamer::EmitSymbolAttribute(MCSymbol *Symbol,
// Since .reference sets the no dead strip bit, it is equivalent to
// .no_dead_strip in practice.
case MCStreamer::Reference:
case MCStreamer::NoDeadStrip:
case MCSA_Reference:
case MCSA_NoDeadStrip:
SD.setFlags(SD.getFlags() | SF_NoDeadStrip);
break;
case MCStreamer::PrivateExtern:
case MCSA_PrivateExtern:
SD.setExternal(true);
SD.setPrivateExtern(true);
break;
case MCStreamer::WeakReference:
case MCSA_WeakReference:
// FIXME: This requires -dynamic.
if (Symbol->isUndefined())
SD.setFlags(SD.getFlags() | SF_WeakReference);
break;
case MCStreamer::WeakDefinition:
case MCSA_WeakDefinition:
// FIXME: 'as' enforces that this is defined and global. The manual claims
// it has to be in a coalesced section, but this isn't enforced.
SD.setFlags(SD.getFlags() | SF_WeakDefinition);

View File

@ -31,11 +31,11 @@ namespace {
virtual void EmitLabel(MCSymbol *Symbol) {}
virtual void EmitAssemblerFlag(AssemblerFlag Flag) {}
virtual void EmitAssemblerFlag(MCAssemblerFlag Flag) {}
virtual void EmitAssignment(MCSymbol *Symbol, const MCExpr *Value) {}
virtual void EmitSymbolAttribute(MCSymbol *Symbol, SymbolAttr Attribute) {}
virtual void EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute){}
virtual void EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) {}

View File

@ -702,29 +702,29 @@ bool AsmParser::ParseStatement() {
// Symbol attribute directives
if (IDVal == ".globl" || IDVal == ".global")
return ParseDirectiveSymbolAttribute(MCStreamer::Global);
return ParseDirectiveSymbolAttribute(MCSA_Global);
if (IDVal == ".hidden")
return ParseDirectiveSymbolAttribute(MCStreamer::Hidden);
return ParseDirectiveSymbolAttribute(MCSA_Hidden);
if (IDVal == ".indirect_symbol")
return ParseDirectiveSymbolAttribute(MCStreamer::IndirectSymbol);
return ParseDirectiveSymbolAttribute(MCSA_IndirectSymbol);
if (IDVal == ".internal")
return ParseDirectiveSymbolAttribute(MCStreamer::Internal);
return ParseDirectiveSymbolAttribute(MCSA_Internal);
if (IDVal == ".lazy_reference")
return ParseDirectiveSymbolAttribute(MCStreamer::LazyReference);
return ParseDirectiveSymbolAttribute(MCSA_LazyReference);
if (IDVal == ".no_dead_strip")
return ParseDirectiveSymbolAttribute(MCStreamer::NoDeadStrip);
return ParseDirectiveSymbolAttribute(MCSA_NoDeadStrip);
if (IDVal == ".private_extern")
return ParseDirectiveSymbolAttribute(MCStreamer::PrivateExtern);
return ParseDirectiveSymbolAttribute(MCSA_PrivateExtern);
if (IDVal == ".protected")
return ParseDirectiveSymbolAttribute(MCStreamer::Protected);
return ParseDirectiveSymbolAttribute(MCSA_Protected);
if (IDVal == ".reference")
return ParseDirectiveSymbolAttribute(MCStreamer::Reference);
return ParseDirectiveSymbolAttribute(MCSA_Reference);
if (IDVal == ".weak")
return ParseDirectiveSymbolAttribute(MCStreamer::Weak);
return ParseDirectiveSymbolAttribute(MCSA_Weak);
if (IDVal == ".weak_definition")
return ParseDirectiveSymbolAttribute(MCStreamer::WeakDefinition);
return ParseDirectiveSymbolAttribute(MCSA_WeakDefinition);
if (IDVal == ".weak_reference")
return ParseDirectiveSymbolAttribute(MCStreamer::WeakReference);
return ParseDirectiveSymbolAttribute(MCSA_WeakReference);
if (IDVal == ".comm")
return ParseDirectiveComm(/*IsLocal=*/false);
@ -1238,7 +1238,7 @@ bool AsmParser::ParseDirectiveAlign(bool IsPow2, unsigned ValueSize) {
/// ParseDirectiveSymbolAttribute
/// ::= { ".globl", ".weak", ... } [ identifier ( , identifier )* ]
bool AsmParser::ParseDirectiveSymbolAttribute(MCStreamer::SymbolAttr Attr) {
bool AsmParser::ParseDirectiveSymbolAttribute(MCSymbolAttr Attr) {
if (Lexer.isNot(AsmToken::EndOfStatement)) {
for (;;) {
StringRef Name;
@ -1463,7 +1463,7 @@ bool AsmParser::ParseDirectiveDarwinSubsectionsViaSymbols() {
Lex();
Out.EmitAssemblerFlag(MCStreamer::SubsectionsViaSymbols);
Out.EmitAssemblerFlag(MCAF_SubsectionsViaSymbols);
return false;
}

View File

@ -1205,7 +1205,7 @@ void ARMAsmPrinter::EmitEndOfAsmFile(Module &M) {
// implementation of multiple entry points). If this doesn't occur, the
// linker can safely perform dead code stripping. Since LLVM never
// generates code that does this, it is always safe to set.
OutStreamer.EmitAssemblerFlag(MCStreamer::SubsectionsViaSymbols);
OutStreamer.EmitAssemblerFlag(MCAF_SubsectionsViaSymbols);
}
}

View File

@ -968,7 +968,7 @@ bool PPCDarwinAsmPrinter::doFinalization(Module &M) {
// implementation of multiple entry points). If this doesn't occur, the
// linker can safely perform dead code stripping. Since LLVM never generates
// code that does this, it is always safe to set.
OutStreamer.EmitAssemblerFlag(MCStreamer::SubsectionsViaSymbols);
OutStreamer.EmitAssemblerFlag(MCAF_SubsectionsViaSymbols);
return AsmPrinter::doFinalization(M);
}

View File

@ -84,7 +84,7 @@ void X86AsmPrinter::emitFunctionHeader(const MachineFunction &MF) {
break;
case Function::DLLExportLinkage:
case Function::ExternalLinkage:
OutStreamer.EmitSymbolAttribute(CurrentFnSym, MCStreamer::Global);
OutStreamer.EmitSymbolAttribute(CurrentFnSym, MCSA_Global);
break;
case Function::LinkerPrivateLinkage:
case Function::LinkOnceAnyLinkage:
@ -92,10 +92,10 @@ void X86AsmPrinter::emitFunctionHeader(const MachineFunction &MF) {
case Function::WeakAnyLinkage:
case Function::WeakODRLinkage:
if (Subtarget->isTargetDarwin()) {
OutStreamer.EmitSymbolAttribute(CurrentFnSym, MCStreamer::Global);
OutStreamer.EmitSymbolAttribute(CurrentFnSym, MCSA_Global);
O << MAI->getWeakDefDirective() << *CurrentFnSym << '\n';
} else if (Subtarget->isTargetCygMing()) {
OutStreamer.EmitSymbolAttribute(CurrentFnSym, MCStreamer::Global);
OutStreamer.EmitSymbolAttribute(CurrentFnSym, MCSA_Global);
O << "\t.linkonce discard\n";
} else {
O << "\t.weak\t" << *CurrentFnSym << '\n';
@ -709,7 +709,7 @@ void X86AsmPrinter::EmitEndOfAsmFile(Module &M) {
// implementation of multiple entry points). If this doesn't occur, the
// linker can safely perform dead code stripping. Since LLVM never
// generates code that does this, it is always safe to set.
OutStreamer.EmitAssemblerFlag(MCStreamer::SubsectionsViaSymbols);
OutStreamer.EmitAssemblerFlag(MCAF_SubsectionsViaSymbols);
}
if (Subtarget->isTargetCOFF()) {