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:
parent
f2bff76dd3
commit
f727ae92f5
@ -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;
|
||||||
|
@ -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.
|
||||||
///
|
///
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
@ -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,
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
|
@ -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
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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;
|
||||||
};
|
};
|
||||||
|
@ -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;
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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,
|
||||||
|
@ -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
|
||||||
|
@ -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,
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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,
|
||||||
|
Loading…
Reference in New Issue
Block a user