1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-25 04:02:41 +01:00

[MC] Make MCStreamer aware of AsmParser's StartTokLoc

A SMLoc allows MCStreamer to report location-aware diagnostics, which
were previously done by adding SMLoc to various methods (e.g. emit*) in an ad-hoc way.

Since the file:line is most important, the column is less important and
the start token location suffices in many cases, this patch reverts
b7e7131af2dd7bdb03fa42a3bc1b4bc72ab95ce1

```
// old
symbol-binding-changed.s:6:8: error: local changed binding to STB_GLOBAL
.globl local
       ^
// new
symbol-binding-changed.s:6:1: error: local changed binding to STB_GLOBAL
.globl local
^
```

Reviewed By: rnk

Differential Revision: https://reviews.llvm.org/D90511
This commit is contained in:
Fangrui Song 2020-11-02 12:32:06 -08:00
parent f2bff76dd3
commit f727ae92f5
20 changed files with 55 additions and 47 deletions

View File

@ -46,8 +46,7 @@ public:
void emitAssemblerFlag(MCAssemblerFlag Flag) override; void emitAssemblerFlag(MCAssemblerFlag Flag) override;
void emitThumbFunc(MCSymbol *Func) override; void emitThumbFunc(MCSymbol *Func) override;
void emitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol) override; void emitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol) override;
bool emitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute, bool emitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute) override;
SMLoc Loc = SMLoc()) override;
void emitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) override; void emitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) override;
void emitCommonSymbol(MCSymbol *Symbol, uint64_t Size, void emitCommonSymbol(MCSymbol *Symbol, uint64_t Size,
unsigned ByteAlignment) override; unsigned ByteAlignment) override;

View File

@ -215,6 +215,10 @@ class MCStreamer {
/// PushSection. /// PushSection.
SmallVector<std::pair<MCSectionSubPair, MCSectionSubPair>, 4> SectionStack; SmallVector<std::pair<MCSectionSubPair, MCSectionSubPair>, 4> SectionStack;
/// Pointer to the parser's SMLoc if available. This is used to provide
/// locations for diagnostics.
const SMLoc *StartTokLocPtr = nullptr;
/// The next unique ID to use when creating a WinCFI-related section (.pdata /// The next unique ID to use when creating a WinCFI-related section (.pdata
/// or .xdata). This ID ensures that we have a one-to-one mapping from /// or .xdata). This ID ensures that we have a one-to-one mapping from
/// code section to unwind info section, which MSVC's incremental linker /// code section to unwind info section, which MSVC's incremental linker
@ -259,6 +263,11 @@ public:
TargetStreamer.reset(TS); TargetStreamer.reset(TS);
} }
void setStartTokLocPtr(const SMLoc *Loc) { StartTokLocPtr = Loc; }
SMLoc getStartTokLoc() const {
return StartTokLocPtr ? *StartTokLocPtr : SMLoc();
}
/// State management /// State management
/// ///
virtual void reset(); virtual void reset();
@ -508,8 +517,8 @@ public:
virtual void emitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol); virtual void emitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol);
/// Add the given \p Attribute to \p Symbol. /// Add the given \p Attribute to \p Symbol.
virtual bool emitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute, virtual bool emitSymbolAttribute(MCSymbol *Symbol,
SMLoc Loc = SMLoc()) = 0; MCSymbolAttr Attribute) = 0;
/// Set the \p DescValue for the \p Symbol. /// Set the \p DescValue for the \p Symbol.
/// ///

View File

@ -44,8 +44,7 @@ public:
void emitAssemblerFlag(MCAssemblerFlag Flag) override; void emitAssemblerFlag(MCAssemblerFlag Flag) override;
void emitThumbFunc(MCSymbol *Func) override; void emitThumbFunc(MCSymbol *Func) override;
void emitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol) override; void emitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol) override;
bool emitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute, bool emitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute) override;
SMLoc) override;
void emitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) override; void emitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) override;
void emitCommonSymbol(MCSymbol *Symbol, uint64_t Size, void emitCommonSymbol(MCSymbol *Symbol, uint64_t Size,
unsigned ByteAlignment) override; unsigned ByteAlignment) override;

View File

@ -43,8 +43,7 @@ public:
void emitLabel(MCSymbol *Symbol, SMLoc Loc = SMLoc()) override; void emitLabel(MCSymbol *Symbol, SMLoc Loc = SMLoc()) override;
void emitAssemblerFlag(MCAssemblerFlag Flag) override; void emitAssemblerFlag(MCAssemblerFlag Flag) override;
void emitThumbFunc(MCSymbol *Func) override; void emitThumbFunc(MCSymbol *Func) override;
bool emitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute, bool emitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute) override;
SMLoc Loc = SMLoc()) override;
void emitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) override; void emitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) override;
void BeginCOFFSymbolDef(MCSymbol const *Symbol) override; void BeginCOFFSymbolDef(MCSymbol const *Symbol) override;
void EmitCOFFSymbolStorageClass(int StorageClass) override; void EmitCOFFSymbolStorageClass(int StorageClass) override;

View File

@ -19,8 +19,7 @@ public:
std::unique_ptr<MCObjectWriter> OW, std::unique_ptr<MCObjectWriter> OW,
std::unique_ptr<MCCodeEmitter> Emitter); std::unique_ptr<MCCodeEmitter> Emitter);
bool emitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute, bool emitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute) override;
SMLoc Loc = SMLoc()) override;
void emitCommonSymbol(MCSymbol *Symbol, uint64_t Size, void emitCommonSymbol(MCSymbol *Symbol, uint64_t Size,
unsigned ByteAlignment) override; unsigned ByteAlignment) override;
void emitZerofill(MCSection *Section, MCSymbol *Symbol = nullptr, void emitZerofill(MCSection *Section, MCSymbol *Symbol = nullptr,

View File

@ -157,8 +157,7 @@ public:
void emitAssignment(MCSymbol *Symbol, const MCExpr *Value) override; void emitAssignment(MCSymbol *Symbol, const MCExpr *Value) override;
void emitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol) override; void emitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol) override;
bool emitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute, bool emitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute) override;
SMLoc) override;
void emitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) override; void emitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) override;
void BeginCOFFSymbolDef(const MCSymbol *Symbol) override; void BeginCOFFSymbolDef(const MCSymbol *Symbol) override;
@ -636,7 +635,7 @@ void MCAsmStreamer::emitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol) {
} }
bool MCAsmStreamer::emitSymbolAttribute(MCSymbol *Symbol, bool MCAsmStreamer::emitSymbolAttribute(MCSymbol *Symbol,
MCSymbolAttr Attribute, SMLoc) { MCSymbolAttr Attribute) {
switch (Attribute) { switch (Attribute) {
case MCSA_Invalid: llvm_unreachable("Invalid symbol attribute"); case MCSA_Invalid: llvm_unreachable("Invalid symbol attribute");
case MCSA_ELF_TypeFunction: /// .type _foo, STT_FUNC # aka @function case MCSA_ELF_TypeFunction: /// .type _foo, STT_FUNC # aka @function

View File

@ -187,8 +187,7 @@ static unsigned CombineSymbolTypes(unsigned T1, unsigned T2) {
return T2; return T2;
} }
bool MCELFStreamer::emitSymbolAttribute(MCSymbol *S, MCSymbolAttr Attribute, bool MCELFStreamer::emitSymbolAttribute(MCSymbol *S, MCSymbolAttr Attribute) {
SMLoc Loc) {
auto *Symbol = cast<MCSymbolELF>(S); auto *Symbol = cast<MCSymbolELF>(S);
// Adding a symbol attribute always introduces the symbol, note that an // Adding a symbol attribute always introduces the symbol, note that an
@ -230,8 +229,9 @@ bool MCELFStreamer::emitSymbolAttribute(MCSymbol *S, MCSymbolAttr Attribute,
// traditionally set the binding to STB_GLOBAL. This is error-prone, so we // traditionally set the binding to STB_GLOBAL. This is error-prone, so we
// error on such cases. Note, we also disallow changed binding from .local. // error on such cases. Note, we also disallow changed binding from .local.
if (Symbol->isBindingSet() && Symbol->getBinding() != ELF::STB_GLOBAL) if (Symbol->isBindingSet() && Symbol->getBinding() != ELF::STB_GLOBAL)
getContext().reportError(Loc, Symbol->getName() + getContext().reportError(getStartTokLoc(),
" changed binding to STB_GLOBAL"); Symbol->getName() +
" changed binding to STB_GLOBAL");
Symbol->setBinding(ELF::STB_GLOBAL); Symbol->setBinding(ELF::STB_GLOBAL);
Symbol->setExternal(true); Symbol->setExternal(true);
break; break;
@ -241,16 +241,17 @@ bool MCELFStreamer::emitSymbolAttribute(MCSymbol *S, MCSymbolAttr Attribute,
// For `.global x; .weak x`, both MC and GNU as set the binding to STB_WEAK. // For `.global x; .weak x`, both MC and GNU as set the binding to STB_WEAK.
// We emit a warning for now but may switch to an error in the future. // We emit a warning for now but may switch to an error in the future.
if (Symbol->isBindingSet() && Symbol->getBinding() != ELF::STB_WEAK) if (Symbol->isBindingSet() && Symbol->getBinding() != ELF::STB_WEAK)
getContext().reportWarning(Loc, Symbol->getName() + getContext().reportWarning(
" changed binding to STB_WEAK"); getStartTokLoc(), Symbol->getName() + " changed binding to STB_WEAK");
Symbol->setBinding(ELF::STB_WEAK); Symbol->setBinding(ELF::STB_WEAK);
Symbol->setExternal(true); Symbol->setExternal(true);
break; break;
case MCSA_Local: case MCSA_Local:
if (Symbol->isBindingSet() && Symbol->getBinding() != ELF::STB_LOCAL) if (Symbol->isBindingSet() && Symbol->getBinding() != ELF::STB_LOCAL)
getContext().reportError(Loc, Symbol->getName() + getContext().reportError(getStartTokLoc(),
" changed binding to STB_LOCAL"); Symbol->getName() +
" changed binding to STB_LOCAL");
Symbol->setBinding(ELF::STB_LOCAL); Symbol->setBinding(ELF::STB_LOCAL);
Symbol->setExternal(false); Symbol->setExternal(false);
break; break;

View File

@ -93,8 +93,7 @@ public:
void emitBuildVersion(unsigned Platform, unsigned Major, unsigned Minor, void emitBuildVersion(unsigned Platform, unsigned Major, unsigned Minor,
unsigned Update, VersionTuple SDKVersion) override; unsigned Update, VersionTuple SDKVersion) override;
void emitThumbFunc(MCSymbol *Func) override; void emitThumbFunc(MCSymbol *Func) override;
bool emitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute, bool emitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute) override;
SMLoc Loc = SMLoc()) override;
void emitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) override; void emitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) override;
void emitCommonSymbol(MCSymbol *Symbol, uint64_t Size, void emitCommonSymbol(MCSymbol *Symbol, uint64_t Size,
unsigned ByteAlignment) override; unsigned ByteAlignment) override;
@ -291,8 +290,8 @@ void MCMachOStreamer::emitThumbFunc(MCSymbol *Symbol) {
cast<MCSymbolMachO>(Symbol)->setThumbFunc(); cast<MCSymbolMachO>(Symbol)->setThumbFunc();
} }
bool MCMachOStreamer::emitSymbolAttribute(MCSymbol *Sym, MCSymbolAttr Attribute, bool MCMachOStreamer::emitSymbolAttribute(MCSymbol *Sym,
SMLoc) { MCSymbolAttr Attribute) {
MCSymbolMachO *Symbol = cast<MCSymbolMachO>(Sym); MCSymbolMachO *Symbol = cast<MCSymbolMachO>(Sym);
// Indirect symbols are handled differently, to match how 'as' handles // Indirect symbols are handled differently, to match how 'as' handles

View File

@ -25,7 +25,8 @@ namespace {
bool hasRawTextSupport() const override { return true; } bool hasRawTextSupport() const override { return true; }
void emitRawTextImpl(StringRef String) override {} void emitRawTextImpl(StringRef String) override {}
bool emitSymbolAttribute(MCSymbol *, MCSymbolAttr, SMLoc) override { bool emitSymbolAttribute(MCSymbol *Symbol,
MCSymbolAttr Attribute) override {
return true; return true;
} }

View File

@ -126,6 +126,7 @@ private:
SourceMgr::DiagHandlerTy SavedDiagHandler; SourceMgr::DiagHandlerTy SavedDiagHandler;
void *SavedDiagContext; void *SavedDiagContext;
std::unique_ptr<MCAsmParserExtension> PlatformParser; std::unique_ptr<MCAsmParserExtension> PlatformParser;
SMLoc StartTokLoc;
/// This is the current buffer index we're lexing from as managed by the /// This is the current buffer index we're lexing from as managed by the
/// SourceMgr object. /// SourceMgr object.
@ -709,6 +710,8 @@ AsmParser::AsmParser(SourceMgr &SM, MCContext &Ctx, MCStreamer &Out,
// Set our own handler which calls the saved handler. // Set our own handler which calls the saved handler.
SrcMgr.setDiagHandler(DiagHandler, this); SrcMgr.setDiagHandler(DiagHandler, this);
Lexer.setBuffer(SrcMgr.getMemoryBuffer(CurBuffer)->getBuffer()); Lexer.setBuffer(SrcMgr.getMemoryBuffer(CurBuffer)->getBuffer());
// Make MCStreamer aware of the StartTokLoc for locations in diagnostics.
Out.setStartTokLocPtr(&StartTokLoc);
// Initialize the platform / file format parser. // Initialize the platform / file format parser.
switch (Ctx.getObjectFileInfo()->getObjectFileType()) { switch (Ctx.getObjectFileInfo()->getObjectFileType()) {
@ -742,6 +745,8 @@ AsmParser::~AsmParser() {
assert((HadError || ActiveMacros.empty()) && assert((HadError || ActiveMacros.empty()) &&
"Unexpected active macro instantiation!"); "Unexpected active macro instantiation!");
// Remove MCStreamer's reference to the parser SMLoc.
Out.setStartTokLocPtr(nullptr);
// Restore the saved diagnostics handler and context for use during // Restore the saved diagnostics handler and context for use during
// finalization. // finalization.
SrcMgr.setDiagHandler(SavedDiagHandler, SavedDiagContext); SrcMgr.setDiagHandler(SavedDiagHandler, SavedDiagContext);
@ -1705,6 +1710,7 @@ bool AsmParser::parseStatement(ParseStatementInfo &Info,
SMLoc IDLoc = ID.getLoc(); SMLoc IDLoc = ID.getLoc();
StringRef IDVal; StringRef IDVal;
int64_t LocalLabelVal = -1; int64_t LocalLabelVal = -1;
StartTokLoc = ID.getLoc();
if (Lexer.is(AsmToken::HashDirective)) if (Lexer.is(AsmToken::HashDirective))
return parseCppHashLineFilenameComment(IDLoc, return parseCppHashLineFilenameComment(IDLoc,
!isInsideMacroInstantiation()); !isInsideMacroInstantiation());
@ -4881,7 +4887,7 @@ bool AsmParser::parseDirectiveSymbolAttribute(MCSymbolAttr Attr) {
if (Sym->isTemporary()) if (Sym->isTemporary())
return Error(Loc, "non-local symbol required"); return Error(Loc, "non-local symbol required");
if (!getStreamer().emitSymbolAttribute(Sym, Attr, Loc)) if (!getStreamer().emitSymbolAttribute(Sym, Attr))
return Error(Loc, "unable to emit symbol attribute"); return Error(Loc, "unable to emit symbol attribute");
return false; return false;
}; };

View File

@ -178,13 +178,13 @@ bool ELFAsmParser::ParseDirectiveSymbolAttribute(StringRef Directive, SMLoc) {
if (getLexer().isNot(AsmToken::EndOfStatement)) { if (getLexer().isNot(AsmToken::EndOfStatement)) {
while (true) { while (true) {
StringRef Name; StringRef Name;
SMLoc Loc = getTok().getLoc();
if (getParser().parseIdentifier(Name)) if (getParser().parseIdentifier(Name))
return TokError("expected identifier in directive"); return TokError("expected identifier in directive");
MCSymbol *Sym = getContext().getOrCreateSymbol(Name); MCSymbol *Sym = getContext().getOrCreateSymbol(Name);
getStreamer().emitSymbolAttribute(Sym, Attr, Loc); getStreamer().emitSymbolAttribute(Sym, Attr);
if (getLexer().is(AsmToken::EndOfStatement)) if (getLexer().is(AsmToken::EndOfStatement))
break; break;

View File

@ -77,8 +77,7 @@ void MCWasmStreamer::emitWeakReference(MCSymbol *Alias,
Alias->setVariableValue(Value); Alias->setVariableValue(Value);
} }
bool MCWasmStreamer::emitSymbolAttribute(MCSymbol *S, MCSymbolAttr Attribute, bool MCWasmStreamer::emitSymbolAttribute(MCSymbol *S, MCSymbolAttr Attribute) {
SMLoc) {
assert(Attribute != MCSA_IndirectSymbol && "indirect symbols not supported"); assert(Attribute != MCSA_IndirectSymbol && "indirect symbols not supported");
auto *Symbol = cast<MCSymbolWasm>(S); auto *Symbol = cast<MCSymbolWasm>(S);

View File

@ -107,8 +107,8 @@ void MCWinCOFFStreamer::emitThumbFunc(MCSymbol *Func) {
llvm_unreachable("not implemented"); llvm_unreachable("not implemented");
} }
bool MCWinCOFFStreamer::emitSymbolAttribute(MCSymbol *S, MCSymbolAttr Attribute, bool MCWinCOFFStreamer::emitSymbolAttribute(MCSymbol *S,
SMLoc) { MCSymbolAttr Attribute) {
auto *Symbol = cast<MCSymbolCOFF>(S); auto *Symbol = cast<MCSymbolCOFF>(S);
getAssembler().registerSymbol(*Symbol); getAssembler().registerSymbol(*Symbol);

View File

@ -29,8 +29,8 @@ MCXCOFFStreamer::MCXCOFFStreamer(MCContext &Context,
: MCObjectStreamer(Context, std::move(MAB), std::move(OW), : MCObjectStreamer(Context, std::move(MAB), std::move(OW),
std::move(Emitter)) {} std::move(Emitter)) {}
bool MCXCOFFStreamer::emitSymbolAttribute(MCSymbol *Sym, MCSymbolAttr Attribute, bool MCXCOFFStreamer::emitSymbolAttribute(MCSymbol *Sym,
SMLoc) { MCSymbolAttr Attribute) {
auto *Symbol = cast<MCSymbolXCOFF>(Sym); auto *Symbol = cast<MCSymbolXCOFF>(Sym);
getAssembler().registerSymbol(*Symbol); getAssembler().registerSymbol(*Symbol);

View File

@ -97,7 +97,7 @@ void RecordStreamer::emitAssignment(MCSymbol *Symbol, const MCExpr *Value) {
} }
bool RecordStreamer::emitSymbolAttribute(MCSymbol *Symbol, bool RecordStreamer::emitSymbolAttribute(MCSymbol *Symbol,
MCSymbolAttr Attribute, SMLoc) { MCSymbolAttr Attribute) {
if (Attribute == MCSA_Global || Attribute == MCSA_Weak) if (Attribute == MCSA_Global || Attribute == MCSA_Weak)
markGlobal(*Symbol, Attribute); markGlobal(*Symbol, Attribute);
if (Attribute == MCSA_LazyReference) if (Attribute == MCSA_LazyReference)
@ -226,7 +226,7 @@ void RecordStreamer::flushSymverDirectives() {
// Don't use EmitAssignment override as it always marks alias as defined. // Don't use EmitAssignment override as it always marks alias as defined.
MCStreamer::emitAssignment(Alias, Value); MCStreamer::emitAssignment(Alias, Value);
if (Attr != MCSA_Invalid) if (Attr != MCSA_Invalid)
emitSymbolAttribute(Alias, Attr, SMLoc()); emitSymbolAttribute(Alias, Attr);
} }
} }
} }

View File

@ -48,8 +48,7 @@ public:
void emitInstruction(const MCInst &Inst, const MCSubtargetInfo &STI) override; void emitInstruction(const MCInst &Inst, const MCSubtargetInfo &STI) override;
void emitLabel(MCSymbol *Symbol, SMLoc Loc = SMLoc()) override; void emitLabel(MCSymbol *Symbol, SMLoc Loc = SMLoc()) override;
void emitAssignment(MCSymbol *Symbol, const MCExpr *Value) override; void emitAssignment(MCSymbol *Symbol, const MCExpr *Value) override;
bool emitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute, bool emitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute) override;
SMLoc Loc) override;
void emitZerofill(MCSection *Section, MCSymbol *Symbol, uint64_t Size, void emitZerofill(MCSection *Section, MCSymbol *Symbol, uint64_t Size,
unsigned ByteAlignment, SMLoc Loc = SMLoc()) override; unsigned ByteAlignment, SMLoc Loc = SMLoc()) override;
void emitCommonSymbol(MCSymbol *Symbol, uint64_t Size, void emitCommonSymbol(MCSymbol *Symbol, uint64_t Size,

View File

@ -1,17 +1,17 @@
# RUN: not llvm-mc -filetype=obj -triple=x86_64 %s -o /dev/null 2>&1 | FileCheck %s --implicit-check-not=error: # RUN: not llvm-mc -filetype=obj -triple=x86_64 %s -o /dev/null 2>&1 | FileCheck %s --implicit-check-not=error:
# CHECK: {{.*}}.s:[[#@LINE+3]]:8: error: local changed binding to STB_GLOBAL # CHECK: {{.*}}.s:[[#@LINE+3]]:1: error: local changed binding to STB_GLOBAL
local: local:
.local local .local local
.globl local .globl local
## `.globl x; .weak x` matches the GNU as behavior. We issue a warning for now. ## `.globl x; .weak x` matches the GNU as behavior. We issue a warning for now.
# CHECK: {{.*}}.s:[[#@LINE+3]]:7: warning: global changed binding to STB_WEAK # CHECK: {{.*}}.s:[[#@LINE+3]]:1: warning: global changed binding to STB_WEAK
global: global:
.global global .global global
.weak global .weak global
# CHECK: {{.*}}.s:[[#@LINE+3]]:8: error: weak changed binding to STB_LOCAL # CHECK: {{.*}}.s:[[#@LINE+3]]:1: error: weak changed binding to STB_LOCAL
weak: weak:
.weak weak .weak weak
.local weak .local weak

View File

@ -89,8 +89,7 @@ private:
// We only care about instructions, we don't implement this part of the API. // We only care about instructions, we don't implement this part of the API.
void emitCommonSymbol(MCSymbol *Symbol, uint64_t Size, void emitCommonSymbol(MCSymbol *Symbol, uint64_t Size,
unsigned ByteAlignment) override {} unsigned ByteAlignment) override {}
bool emitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute, bool emitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute) override {
SMLoc) override {
return false; return false;
} }
void emitValueToAlignment(unsigned ByteAlignment, int64_t Value, void emitValueToAlignment(unsigned ByteAlignment, int64_t Value,

View File

@ -52,7 +52,7 @@ public:
Regions.addInstruction(Inst); Regions.addInstruction(Inst);
} }
bool emitSymbolAttribute(MCSymbol *, MCSymbolAttr, SMLoc) override { bool emitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute) override {
return true; return true;
} }

View File

@ -28,8 +28,8 @@ public:
// These methods are pure virtual in MCStreamer, thus, have to be overridden: // These methods are pure virtual in MCStreamer, thus, have to be overridden:
MOCK_METHOD3(emitSymbolAttribute, MOCK_METHOD2(emitSymbolAttribute,
bool(MCSymbol *Symbol, MCSymbolAttr Attribute, SMLoc Loc)); bool(MCSymbol *Symbol, MCSymbolAttr Attribute));
MOCK_METHOD3(emitCommonSymbol, MOCK_METHOD3(emitCommonSymbol,
void(MCSymbol *Symbol, uint64_t Size, unsigned ByteAlignment)); void(MCSymbol *Symbol, uint64_t Size, unsigned ByteAlignment));
MOCK_METHOD5(emitZerofill, MOCK_METHOD5(emitZerofill,