From 24e12e0726f15dd2002a1091e6a8e50d9a4ebf49 Mon Sep 17 00:00:00 2001 From: Arthur Eubanks Date: Wed, 21 Apr 2021 12:13:53 -0700 Subject: [PATCH] [LLParser] Print mismatched types in error message Helps with debugging invalid handcrafted IR. Reviewed By: rnk Differential Revision: https://reviews.llvm.org/D100990 --- llvm/lib/AsmParser/LLParser.cpp | 48 ++++++++++++++++------ .../invalid-alias-mismatched-explicit-type.ll | 2 +- .../invalid-gep-mismatched-explicit-type.ll | 2 +- .../invalid-load-mismatched-explicit-type.ll | 2 +- 4 files changed, 39 insertions(+), 15 deletions(-) diff --git a/llvm/lib/AsmParser/LLParser.cpp b/llvm/lib/AsmParser/LLParser.cpp index db2cb66..d56fca1 100644 --- a/llvm/lib/AsmParser/LLParser.cpp +++ b/llvm/lib/AsmParser/LLParser.cpp @@ -931,6 +931,14 @@ static void maybeSetDSOLocal(bool DSOLocal, GlobalValue &GV) { GV.setDSOLocal(true); } +static std::string typeComparisonErrorMessage(StringRef Message, Type *Ty1, + Type *Ty2) { + std::string ErrString; + raw_string_ostream ErrOS(ErrString); + ErrOS << Message << " (" << *Ty1 << " vs " << *Ty2 << ")"; + return ErrOS.str(); +} + /// parseIndirectSymbol: /// ::= GlobalVar '=' OptionalLinkage OptionalPreemptionSpecifier /// OptionalVisibility OptionalDLLStorageClass @@ -998,13 +1006,18 @@ bool LLParser::parseIndirectSymbol(const std::string &Name, LocTy NameLoc, return error(AliaseeLoc, "An alias or ifunc must have pointer type"); unsigned AddrSpace = PTy->getAddressSpace(); - if (IsAlias && Ty != PTy->getElementType()) - return error(ExplicitTypeLoc, - "explicit pointee type doesn't match operand's pointee type"); + if (IsAlias && Ty != PTy->getElementType()) { + return error( + ExplicitTypeLoc, + typeComparisonErrorMessage( + "explicit pointee type doesn't match operand's pointee type", Ty, + PTy->getElementType())); + } - if (!IsAlias && !PTy->getElementType()->isFunctionTy()) + if (!IsAlias && !PTy->getElementType()->isFunctionTy()) { return error(ExplicitTypeLoc, "explicit pointee type should be a function type"); + } GlobalValue *GVal = nullptr; @@ -3844,10 +3857,13 @@ bool LLParser::parseValID(ValID &ID, PerFunctionState *PFS) { Type *BaseType = Elts[0]->getType(); auto *BasePointerType = cast(BaseType->getScalarType()); - if (Ty != BasePointerType->getElementType()) + if (Ty != BasePointerType->getElementType()) { return error( ExplicitTypeLoc, - "explicit pointee type doesn't match operand's pointee type"); + typeComparisonErrorMessage( + "explicit pointee type doesn't match operand's pointee type", + Ty, BasePointerType->getElementType())); + } unsigned GEPWidth = BaseType->isVectorTy() @@ -7454,9 +7470,13 @@ int LLParser::parseLoad(Instruction *&Inst, PerFunctionState &PFS) { Ordering == AtomicOrdering::AcquireRelease) return error(Loc, "atomic load cannot use Release ordering"); - if (Ty != cast(Val->getType())->getElementType()) - return error(ExplicitTypeLoc, - "explicit pointee type doesn't match operand's pointee type"); + if (Ty != cast(Val->getType())->getElementType()) { + return error( + ExplicitTypeLoc, + typeComparisonErrorMessage( + "explicit pointee type doesn't match operand's pointee type", Ty, + cast(Val->getType())->getElementType())); + } SmallPtrSet Visited; if (!Alignment && !Ty->isSized(&Visited)) return error(ExplicitTypeLoc, "loading unsized types is not allowed"); @@ -7710,9 +7730,13 @@ int LLParser::parseGetElementPtr(Instruction *&Inst, PerFunctionState &PFS) { if (!BasePointerType) return error(Loc, "base of getelementptr must be a pointer"); - if (Ty != BasePointerType->getElementType()) - return error(ExplicitTypeLoc, - "explicit pointee type doesn't match operand's pointee type"); + if (Ty != BasePointerType->getElementType()) { + return error( + ExplicitTypeLoc, + typeComparisonErrorMessage( + "explicit pointee type doesn't match operand's pointee type", Ty, + BasePointerType->getElementType())); + } SmallVector Indices; bool AteExtraComma = false; diff --git a/llvm/test/Assembler/invalid-alias-mismatched-explicit-type.ll b/llvm/test/Assembler/invalid-alias-mismatched-explicit-type.ll index d282237..36be49d 100644 --- a/llvm/test/Assembler/invalid-alias-mismatched-explicit-type.ll +++ b/llvm/test/Assembler/invalid-alias-mismatched-explicit-type.ll @@ -1,4 +1,4 @@ ; RUN: not llvm-as < %s 2>&1 | FileCheck %s -; CHECK: :4:12: error: explicit pointee type doesn't match operand's pointee type +; CHECK: :4:12: error: explicit pointee type doesn't match operand's pointee type (i1 vs i2) @y = global i2 0 @x = alias i1, i2* @y diff --git a/llvm/test/Assembler/invalid-gep-mismatched-explicit-type.ll b/llvm/test/Assembler/invalid-gep-mismatched-explicit-type.ll index 1fc88dd..c9de924 100644 --- a/llvm/test/Assembler/invalid-gep-mismatched-explicit-type.ll +++ b/llvm/test/Assembler/invalid-gep-mismatched-explicit-type.ll @@ -1,5 +1,5 @@ ; RUN: not llvm-as < %s 2>&1 | FileCheck %s -; CHECK: :4:22: error: explicit pointee type doesn't match operand's pointee type +; CHECK: :4:22: error: explicit pointee type doesn't match operand's pointee type (i16 vs i32) define void @test(i32* %t) { %x = getelementptr i16, i32* %t, i32 0 ret void diff --git a/llvm/test/Assembler/invalid-load-mismatched-explicit-type.ll b/llvm/test/Assembler/invalid-load-mismatched-explicit-type.ll index b8422ed..f199bea 100644 --- a/llvm/test/Assembler/invalid-load-mismatched-explicit-type.ll +++ b/llvm/test/Assembler/invalid-load-mismatched-explicit-type.ll @@ -1,5 +1,5 @@ ; RUN: not llvm-as < %s 2>&1 | FileCheck %s -; CHECK: :4:13: error: explicit pointee type doesn't match operand's pointee type +; CHECK: :4:13: error: explicit pointee type doesn't match operand's pointee type (i16 vs i32) define void @test(i32* %t) { %x = load i16, i32* %t ret void -- 2.7.4