diff --git a/llvm/include/llvm/AsmParser/LLParser.h b/llvm/include/llvm/AsmParser/LLParser.h index 793287c772b5..34bf249cc6d1 100644 --- a/llvm/include/llvm/AsmParser/LLParser.h +++ b/llvm/include/llvm/AsmParser/LLParser.h @@ -407,9 +407,10 @@ namespace llvm { std::map, WholeProgramDevirtResolution::ByArg> &ResByArg); bool parseArgs(std::vector &Args); - void addGlobalValueToIndex(std::string Name, GlobalValue::GUID, + bool addGlobalValueToIndex(std::string Name, GlobalValue::GUID, GlobalValue::LinkageTypes Linkage, unsigned ID, - std::unique_ptr Summary); + std::unique_ptr Summary, + LocTy Loc); bool parseOptionalAllocs(std::vector &Allocs); bool parseMemProfs(std::vector &MIBs); bool parseAllocType(uint8_t &AllocType); diff --git a/llvm/lib/AsmParser/LLParser.cpp b/llvm/lib/AsmParser/LLParser.cpp index 5aa00225170b..1afde5d64040 100644 --- a/llvm/lib/AsmParser/LLParser.cpp +++ b/llvm/lib/AsmParser/LLParser.cpp @@ -8622,9 +8622,9 @@ static void resolveFwdRef(ValueInfo *Fwd, ValueInfo &Resolved) { /// Stores the given Name/GUID and associated summary into the Index. /// Also updates any forward references to the associated entry ID. -void LLParser::addGlobalValueToIndex( +bool LLParser::addGlobalValueToIndex( std::string Name, GlobalValue::GUID GUID, GlobalValue::LinkageTypes Linkage, - unsigned ID, std::unique_ptr Summary) { + unsigned ID, std::unique_ptr Summary, LocTy Loc) { // First create the ValueInfo utilizing the Name or GUID. ValueInfo VI; if (GUID != 0) { @@ -8634,7 +8634,9 @@ void LLParser::addGlobalValueToIndex( assert(!Name.empty()); if (M) { auto *GV = M->getNamedValue(Name); - assert(GV); + if (!GV) + return error(Loc, "Reference to undefined global \"" + Name + "\""); + VI = Index->getOrInsertValueInfo(GV); } else { assert( @@ -8682,6 +8684,8 @@ void LLParser::addGlobalValueToIndex( NumberedValueInfos.resize(ID + 1); NumberedValueInfos[ID] = VI; } + + return false; } /// parseSummaryIndexFlags @@ -8728,6 +8732,7 @@ bool LLParser::parseGVEntry(unsigned ID) { parseToken(lltok::lparen, "expected '(' here")) return true; + LocTy Loc = Lex.getLoc(); std::string Name; GlobalValue::GUID GUID = 0; switch (Lex.getKind()) { @@ -8757,9 +8762,8 @@ bool LLParser::parseGVEntry(unsigned ID) { // an external definition. We pass ExternalLinkage since that is only // used when the GUID must be computed from Name, and in that case // the symbol must have external linkage. - addGlobalValueToIndex(Name, GUID, GlobalValue::ExternalLinkage, ID, - nullptr); - return false; + return addGlobalValueToIndex(Name, GUID, GlobalValue::ExternalLinkage, ID, + nullptr, Loc); } // Have a list of summaries @@ -8800,6 +8804,7 @@ bool LLParser::parseGVEntry(unsigned ID) { /// [',' OptionalRefs]? ')' bool LLParser::parseFunctionSummary(std::string Name, GlobalValue::GUID GUID, unsigned ID) { + LocTy Loc = Lex.getLoc(); assert(Lex.getKind() == lltok::kw_function); Lex.Lex(); @@ -8876,10 +8881,9 @@ bool LLParser::parseFunctionSummary(std::string Name, GlobalValue::GUID GUID, FS->setModulePath(ModulePath); - addGlobalValueToIndex(Name, GUID, (GlobalValue::LinkageTypes)GVFlags.Linkage, - ID, std::move(FS)); - - return false; + return addGlobalValueToIndex(Name, GUID, + (GlobalValue::LinkageTypes)GVFlags.Linkage, ID, + std::move(FS), Loc); } /// VariableSummary @@ -8887,6 +8891,7 @@ bool LLParser::parseFunctionSummary(std::string Name, GlobalValue::GUID GUID, /// [',' OptionalRefs]? ')' bool LLParser::parseVariableSummary(std::string Name, GlobalValue::GUID GUID, unsigned ID) { + LocTy Loc = Lex.getLoc(); assert(Lex.getKind() == lltok::kw_variable); Lex.Lex(); @@ -8934,10 +8939,9 @@ bool LLParser::parseVariableSummary(std::string Name, GlobalValue::GUID GUID, GS->setModulePath(ModulePath); GS->setVTableFuncs(std::move(VTableFuncs)); - addGlobalValueToIndex(Name, GUID, (GlobalValue::LinkageTypes)GVFlags.Linkage, - ID, std::move(GS)); - - return false; + return addGlobalValueToIndex(Name, GUID, + (GlobalValue::LinkageTypes)GVFlags.Linkage, ID, + std::move(GS), Loc); } /// AliasSummary @@ -8984,10 +8988,9 @@ bool LLParser::parseAliasSummary(std::string Name, GlobalValue::GUID GUID, AS->setAliasee(AliaseeVI, Summary); } - addGlobalValueToIndex(Name, GUID, (GlobalValue::LinkageTypes)GVFlags.Linkage, - ID, std::move(AS)); - - return false; + return addGlobalValueToIndex(Name, GUID, + (GlobalValue::LinkageTypes)GVFlags.Linkage, ID, + std::move(AS), Loc); } /// Flag diff --git a/llvm/test/Assembler/summary-parsing-error.ll b/llvm/test/Assembler/summary-parsing-error.ll new file mode 100644 index 000000000000..47e5c64e1298 --- /dev/null +++ b/llvm/test/Assembler/summary-parsing-error.ll @@ -0,0 +1,4 @@ +; RUN: not llvm-as < %s 2>&1 | FileCheck %s + +; CHECK: Reference to undefined global "does_not_exist" +^0 = gv: (name: "does_not_exist")