[llvm] a803cb9 - [AsmParser] Check forward reference type with opaque pointers
Nikita Popov via llvm-commits
llvm-commits at lists.llvm.org
Fri Mar 11 08:16:43 PST 2022
Author: Nikita Popov
Date: 2022-03-11T17:16:34+01:00
New Revision: a803cb9e52435b8f981328d79bc322ab09416cbd
URL: https://github.com/llvm/llvm-project/commit/a803cb9e52435b8f981328d79bc322ab09416cbd
DIFF: https://github.com/llvm/llvm-project/commit/a803cb9e52435b8f981328d79bc322ab09416cbd.diff
LOG: [AsmParser] Check forward reference type with opaque pointers
While we don't need to check the element type in this case, we
do need to make sure that the pointers have the same address space,
otherwise RAUW will assert.
Added:
llvm/test/Assembler/opaque-ptr-invalid-forward-ref-2.ll
llvm/test/Assembler/opaque-ptr-invalid-forward-ref.ll
Modified:
llvm/lib/AsmParser/LLParser.cpp
Removed:
################################################################################
diff --git a/llvm/lib/AsmParser/LLParser.cpp b/llvm/lib/AsmParser/LLParser.cpp
index adeb3ba15a92a..a98c5284a5a39 100644
--- a/llvm/lib/AsmParser/LLParser.cpp
+++ b/llvm/lib/AsmParser/LLParser.cpp
@@ -1168,7 +1168,7 @@ bool LLParser::parseGlobal(const std::string &Name, LocTy NameLoc,
GV->setUnnamedAddr(UnnamedAddr);
if (GVal) {
- if (!GVal->getType()->isOpaque() && GVal->getValueType() != Ty)
+ if (GVal->getType() != Ty->getPointerTo(AddrSpace))
return error(
TyLoc,
"forward reference and definition of global have
diff erent types");
@@ -5626,20 +5626,19 @@ bool LLParser::parseFunctionHeader(Function *&Fn, bool IsDefine) {
auto FRVI = ForwardRefVals.find(FunctionName);
if (FRVI != ForwardRefVals.end()) {
FwdFn = FRVI->second.first;
- if (!FwdFn->getType()->isOpaque()) {
- if (!FwdFn->getType()->getNonOpaquePointerElementType()->isFunctionTy())
- return error(FRVI->second.second, "invalid forward reference to "
- "function as global value!");
- if (FwdFn->getType() != PFT)
- return error(FRVI->second.second,
- "invalid forward reference to "
- "function '" +
- FunctionName +
- "' with wrong type: "
- "expected '" +
- getTypeString(PFT) + "' but was '" +
- getTypeString(FwdFn->getType()) + "'");
- }
+ if (!FwdFn->getType()->isOpaque() &&
+ !FwdFn->getType()->getNonOpaquePointerElementType()->isFunctionTy())
+ return error(FRVI->second.second, "invalid forward reference to "
+ "function as global value!");
+ if (FwdFn->getType() != PFT)
+ return error(FRVI->second.second,
+ "invalid forward reference to "
+ "function '" +
+ FunctionName +
+ "' with wrong type: "
+ "expected '" +
+ getTypeString(PFT) + "' but was '" +
+ getTypeString(FwdFn->getType()) + "'");
ForwardRefVals.erase(FRVI);
} else if ((Fn = M->getFunction(FunctionName))) {
// Reject redefinitions.
@@ -5655,7 +5654,7 @@ bool LLParser::parseFunctionHeader(Function *&Fn, bool IsDefine) {
auto I = ForwardRefValIDs.find(NumberedVals.size());
if (I != ForwardRefValIDs.end()) {
FwdFn = I->second.first;
- if (!FwdFn->getType()->isOpaque() && FwdFn->getType() != PFT)
+ if (FwdFn->getType() != PFT)
return error(NameLoc, "type of definition and forward reference of '@" +
Twine(NumberedVals.size()) +
"' disagree: "
diff --git a/llvm/test/Assembler/opaque-ptr-invalid-forward-ref-2.ll b/llvm/test/Assembler/opaque-ptr-invalid-forward-ref-2.ll
new file mode 100644
index 0000000000000..bda9ee894420b
--- /dev/null
+++ b/llvm/test/Assembler/opaque-ptr-invalid-forward-ref-2.ll
@@ -0,0 +1,6 @@
+; RUN: not llvm-as -opaque-pointers < %s 2>&1 | FileCheck %s
+
+; CHECK: forward reference and definition of global have
diff erent types
+
+ at a = alias i32, ptr addrspace(1) @g
+ at g = global i32 0
diff --git a/llvm/test/Assembler/opaque-ptr-invalid-forward-ref.ll b/llvm/test/Assembler/opaque-ptr-invalid-forward-ref.ll
new file mode 100644
index 0000000000000..9e11e786124d4
--- /dev/null
+++ b/llvm/test/Assembler/opaque-ptr-invalid-forward-ref.ll
@@ -0,0 +1,9 @@
+; RUN: not llvm-as -opaque-pointers < %s 2>&1 | FileCheck %s
+
+; CHECK: invalid forward reference to function 'f' with wrong type: expected 'ptr' but was 'ptr addrspace(1)'
+
+ at a = alias void (), ptr addrspace(1) @f
+
+define void @f() {
+ ret void
+}
More information about the llvm-commits
mailing list