summarylogtreecommitdiffstats
path: root/GBE-let-GenRegister-reg-never-return-uninitialized-m.patch
diff options
context:
space:
mode:
Diffstat (limited to 'GBE-let-GenRegister-reg-never-return-uninitialized-m.patch')
-rw-r--r--GBE-let-GenRegister-reg-never-return-uninitialized-m.patch37
1 files changed, 37 insertions, 0 deletions
diff --git a/GBE-let-GenRegister-reg-never-return-uninitialized-m.patch b/GBE-let-GenRegister-reg-never-return-uninitialized-m.patch
new file mode 100644
index 000000000000..7f6efa7d14b1
--- /dev/null
+++ b/GBE-let-GenRegister-reg-never-return-uninitialized-m.patch
@@ -0,0 +1,37 @@
+From e837f9f4c6133d8ef56923ffbdbca224b1d7aa23 Mon Sep 17 00:00:00 2001
+From: Michael Lass <bevan@bi-co.net>
+Date: Sun, 1 Dec 2019 13:05:45 +0100
+Subject: [PATCH] GBE: let GenRegister::reg() never return uninitialized memory
+
+GenRegister::reg() is called throughout the code, not only on virtual
+but also on physical registers. For the latter, value.reg is not
+initialized and therefore reg() returns uninitialized memory, leading to
+undefined behavior. Make sure to always return initialized memory by
+returning a valid ir::Register, even for physical registers.
+
+Fixes https://gitlab.freedesktop.org/beignet/beignet/issues/12
+---
+ backend/src/backend/gen_register.hpp | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+diff --git a/backend/src/backend/gen_register.hpp b/backend/src/backend/gen_register.hpp
+index 6c73f5e6..78846c91 100644
+--- a/backend/src/backend/gen_register.hpp
++++ b/backend/src/backend/gen_register.hpp
+@@ -243,7 +243,12 @@ namespace gbe
+ }
+
+ /*! Return the IR virtual register */
+- INLINE ir::Register reg(void) const { return ir::Register(value.reg); }
++ INLINE ir::Register reg(void) const {
++ if (this->physical)
++ return ir::Register();
++ else
++ return ir::Register(value.reg);
++ }
+
+ /*! For immediates or virtual register */
+ union {
+--
+2.24.0
+