Skip to content

Commit ccb9503

Browse files
committed
Handle invalid C++ function names in LLD.
1 parent c839574 commit ccb9503

File tree

4 files changed

+13
-7
lines changed

4 files changed

+13
-7
lines changed

lld/COFF/Driver.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -714,9 +714,8 @@ Symbol *LinkerDriver::addUndefined(StringRef name, bool aliasEC) {
714714
Symbol *t = ctx.symtab.addUndefined(saver().save(*mangledName));
715715
u->setWeakAlias(t, true);
716716
}
717-
} else {
718-
std::optional<std::string> demangledName =
719-
getArm64ECDemangledFunctionName(name);
717+
} else if (std::optional<std::string> demangledName =
718+
getArm64ECDemangledFunctionName(name)) {
720719
Symbol *us = ctx.symtab.addUndefined(saver().save(*demangledName));
721720
auto u = dyn_cast<Undefined>(us);
722721
if (u && !u->weakAlias)

lld/COFF/SymbolTable.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -669,8 +669,11 @@ bool checkLazyECPair(SymbolTable *symtab, StringRef name, InputFile *f) {
669669
if (std::optional<std::string> mangledName =
670670
getArm64ECMangledFunctionName(name))
671671
pairName = std::move(*mangledName);
672+
else if (std::optional<std::string> demangledName =
673+
getArm64ECDemangledFunctionName(name))
674+
pairName = std::move(*demangledName);
672675
else
673-
pairName = *getArm64ECDemangledFunctionName(name);
676+
return true;
674677

675678
Symbol *sym = symtab->find(pairName);
676679
if (!sym)

llvm/lib/IR/Mangler.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,8 @@ std::optional<std::string> llvm::getArm64ECMangledFunctionName(StringRef Name) {
317317
// so look for a `@` instead (since we assume that it will not return a
318318
// qualified type).
319319
InsertIdx = TrimmedName.find_last_of('@');
320-
assert(InsertIdx != StringRef::npos && "Invalid mangled name");
320+
if (InsertIdx == StringRef::npos)
321+
return std::nullopt;
321322
InsertIdx += 1;
322323
}
323324

llvm/lib/Object/COFFImportFile.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -756,8 +756,11 @@ Error writeImportLibrary(StringRef ImportName, StringRef Path,
756756
}
757757
Name = std::move(*MangledName);
758758
} else if (!E.Noname && ExportName.empty()) {
759-
NameType = IMPORT_NAME_EXPORTAS;
760-
ExportName = std::move(*getArm64ECDemangledFunctionName(Name));
759+
if (std::optional<std::string> DemangledName =
760+
getArm64ECDemangledFunctionName(Name)) {
761+
NameType = IMPORT_NAME_EXPORTAS;
762+
ExportName = std::move(*DemangledName);
763+
}
761764
}
762765
}
763766

0 commit comments

Comments
 (0)