[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