Skip to content

Commit 553d4d0

Browse files
committed
[MC] Report locations for .symver errors
1 parent f314bcf commit 553d4d0

7 files changed

+27
-30
lines changed

llvm/include/llvm/MC/MCAssembler.h

+6-1
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,12 @@ class MCAssembler {
211211
handleFixup(const MCAsmLayout &Layout, MCFragment &F, const MCFixup &Fixup);
212212

213213
public:
214-
std::vector<std::pair<StringRef, const MCSymbol *>> Symvers;
214+
struct Symver {
215+
StringRef Name;
216+
const MCSymbol *Sym;
217+
SMLoc Loc;
218+
};
219+
std::vector<Symver> Symvers;
215220

216221
/// Construct a new assembler instance.
217222
//

llvm/lib/MC/ELFObjectWriter.cpp

+7-9
Original file line numberDiff line numberDiff line change
@@ -1258,9 +1258,9 @@ void ELFObjectWriter::executePostLayoutBinding(MCAssembler &Asm,
12581258
const MCAsmLayout &Layout) {
12591259
// The presence of symbol versions causes undefined symbols and
12601260
// versions declared with @@@ to be renamed.
1261-
for (const std::pair<StringRef, const MCSymbol *> &P : Asm.Symvers) {
1262-
StringRef AliasName = P.first;
1263-
const auto &Symbol = cast<MCSymbolELF>(*P.second);
1261+
for (const MCAssembler::Symver &S : Asm.Symvers) {
1262+
StringRef AliasName = S.Name;
1263+
const auto &Symbol = cast<MCSymbolELF>(*S.Sym);
12641264
size_t Pos = AliasName.find('@');
12651265
assert(Pos != StringRef::npos);
12661266

@@ -1286,18 +1286,16 @@ void ELFObjectWriter::executePostLayoutBinding(MCAssembler &Asm,
12861286
if (!Symbol.isUndefined() && !Rest.startswith("@@@"))
12871287
continue;
12881288

1289-
// FIXME: Get source locations for these errors or diagnose them earlier.
12901289
if (Symbol.isUndefined() && Rest.startswith("@@") &&
12911290
!Rest.startswith("@@@")) {
1292-
Asm.getContext().reportError(SMLoc(), "versioned symbol " + AliasName +
1293-
" must be defined");
1291+
Asm.getContext().reportError(S.Loc, "default version symbol " +
1292+
AliasName + " must be defined");
12941293
continue;
12951294
}
12961295

12971296
if (Renames.count(&Symbol) && Renames[&Symbol] != Alias) {
1298-
Asm.getContext().reportError(
1299-
SMLoc(), llvm::Twine("multiple symbol versions defined for ") +
1300-
Symbol.getName());
1297+
Asm.getContext().reportError(S.Loc, Twine("multiple versions for ") +
1298+
Symbol.getName());
13011299
continue;
13021300
}
13031301

llvm/lib/MC/MCELFStreamer.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -342,7 +342,8 @@ void MCELFStreamer::emitELFSize(MCSymbol *Symbol, const MCExpr *Value) {
342342

343343
void MCELFStreamer::emitELFSymverDirective(StringRef AliasName,
344344
const MCSymbol *Aliasee) {
345-
getAssembler().Symvers.push_back({AliasName, Aliasee});
345+
getAssembler().Symvers.push_back(
346+
MCAssembler::Symver{AliasName, Aliasee, getStartTokLoc()});
346347
}
347348

348349
void MCELFStreamer::emitLocalCommonSymbol(MCSymbol *S, uint64_t Size,

llvm/test/MC/ELF/invalid-symver.s

-7
This file was deleted.

llvm/test/MC/ELF/multiple-different-symver.s

-6
This file was deleted.

llvm/test/MC/ELF/multiple-equiv-symver.s

-6
This file was deleted.

llvm/test/MC/ELF/symver-err.s

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
# RUN: not llvm-mc -filetype=obj -triple=x86_64 %s -o /dev/null 2>&1 | FileCheck %s --implicit-check-not=error:
2+
3+
# CHECK: {{.*}}.s:[[#@LINE+2]]:1: error: multiple versions for multi
4+
.symver multi, multi@1
5+
.symver multi, multi@2
6+
7+
.symver equiv, equiv@1
8+
.symver equiv, equiv@1
9+
10+
# CHECK: {{.*}}.s:[[#@LINE+1]]:1: error: default version symbol undefined@@v1 must be defined
11+
.symver undefined_2, undefined@@v1
12+
.long undefined_2

0 commit comments

Comments
 (0)