[PATCH] D20846: [IR] Disallow loading and storing unsized types
Sanjoy Das via llvm-commits
llvm-commits at lists.llvm.org
Wed Jun 1 09:19:39 PDT 2016
This revision was automatically updated to reflect the committed changes.
Closed by commit rL271402: [IR] Disallow loading and storing unsized types (authored by sanjoy).
Changed prior to commit:
http://reviews.llvm.org/D20846?vs=59161&id=59233#toc
Repository:
rL LLVM
http://reviews.llvm.org/D20846
Files:
llvm/trunk/docs/LangRef.rst
llvm/trunk/lib/IR/Verifier.cpp
llvm/trunk/test/Verifier/unsized-types.ll
Index: llvm/trunk/lib/IR/Verifier.cpp
===================================================================
--- llvm/trunk/lib/IR/Verifier.cpp
+++ llvm/trunk/lib/IR/Verifier.cpp
@@ -2963,6 +2963,7 @@
Type *ElTy = LI.getType();
Assert(LI.getAlignment() <= Value::MaximumAlignment,
"huge alignment values are unsupported", &LI);
+ Assert(ElTy->isSized(), "loading unsized types is not allowed", &LI);
if (LI.isAtomic()) {
Assert(LI.getOrdering() != AtomicOrdering::Release &&
LI.getOrdering() != AtomicOrdering::AcquireRelease,
@@ -2991,6 +2992,7 @@
"Stored value type does not match pointer operand type!", &SI, ElTy);
Assert(SI.getAlignment() <= Value::MaximumAlignment,
"huge alignment values are unsupported", &SI);
+ Assert(ElTy->isSized(), "storing unsized types is not allowed", &SI);
if (SI.isAtomic()) {
Assert(SI.getOrdering() != AtomicOrdering::Acquire &&
SI.getOrdering() != AtomicOrdering::AcquireRelease,
Index: llvm/trunk/docs/LangRef.rst
===================================================================
--- llvm/trunk/docs/LangRef.rst
+++ llvm/trunk/docs/LangRef.rst
@@ -6978,12 +6978,12 @@
Arguments:
""""""""""
-The argument to the ``load`` instruction specifies the memory address
-from which to load. The type specified must be a :ref:`first
-class <t_firstclass>` type. If the ``load`` is marked as ``volatile``,
-then the optimizer is not allowed to modify the number or order of
-execution of this ``load`` with other :ref:`volatile
-operations <volatile>`.
+The argument to the ``load`` instruction specifies the memory address from which
+to load. The type specified must be a :ref:`first class <t_firstclass>` type of
+known size (i.e. not containing an :ref:`opaque structural type <t_opaque>`). If
+the ``load`` is marked as ``volatile``, then the optimizer is not allowed to
+modify the number or order of execution of this ``load`` with other
+:ref:`volatile operations <volatile>`.
If the ``load`` is marked as ``atomic``, it takes an extra :ref:`ordering
<ordering>` and optional ``singlethread`` argument. The ``release`` and
@@ -7101,13 +7101,14 @@
Arguments:
""""""""""
-There are two arguments to the ``store`` instruction: a value to store
-and an address at which to store it. The type of the ``<pointer>``
-operand must be a pointer to the :ref:`first class <t_firstclass>` type of
-the ``<value>`` operand. If the ``store`` is marked as ``volatile``,
-then the optimizer is not allowed to modify the number or order of
-execution of this ``store`` with other :ref:`volatile
-operations <volatile>`.
+There are two arguments to the ``store`` instruction: a value to store and an
+address at which to store it. The type of the ``<pointer>`` operand must be a
+pointer to the :ref:`first class <t_firstclass>` type of the ``<value>``
+operand. If the ``store`` is marked as ``volatile``, then the optimizer is not
+allowed to modify the number or order of execution of this ``store`` with other
+:ref:`volatile operations <volatile>`. Only values of :ref:`first class
+<t_firstclass>` types of known size (i.e. not containing an :ref:`opaque
+structural type <t_opaque>`) can be stored.
If the ``store`` is marked as ``atomic``, it takes an extra :ref:`ordering
<ordering>` and optional ``singlethread`` argument. The ``acquire`` and
Index: llvm/trunk/test/Verifier/unsized-types.ll
===================================================================
--- llvm/trunk/test/Verifier/unsized-types.ll
+++ llvm/trunk/test/Verifier/unsized-types.ll
@@ -0,0 +1,24 @@
+; RUN: not opt -verify < %s 2>&1 | FileCheck %s
+
+%X = type opaque
+
+define void @f_0(%X* %ptr) {
+ %t = load %X, %X* %ptr
+ ret void
+; CHECK: loading unsized types is not allowed
+; CHECK-NEXT: %t = load %X, %X* %ptr
+}
+
+define void @f_1(%X %val, %X* %ptr) {
+ store %X %val, %X* %ptr
+ ret void
+; CHECK: storing unsized types is not allowed
+; CHECK-NEXT: store %X %val, %X* %ptr
+}
+
+define void @f_2() {
+ %t = alloca %X
+ ret void
+; CHECK: Cannot allocate unsized type
+; CHECK-NEXT: %t = alloca %X
+}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D20846.59233.patch
Type: text/x-patch
Size: 4127 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160601/df9810c1/attachment.bin>
More information about the llvm-commits
mailing list