[Mesa-dev] [PATCH] Avoid ASan new-delete-type-mismatch

Stephan Bergmann stephan.bergmann.secondary at googlemail.com
Thu Jun 9 14:52:38 UTC 2016


...when Function::domTree is created as DominatorTree in Function::convertToSSA
(src/gallium/drivers/nouveau/codegen/nv50_ir_ssa.cpp) but destroyed only as base
Graph in ~Function (src/gallium/drivers/nouveau/codegen/nv50_ir_bb.cpp).
---
 src/gallium/drivers/nouveau/codegen/nv50_ir.h      | 37 +++++++++++++++++++++-
 .../drivers/nouveau/codegen/nv50_ir_ssa.cpp        | 37 +---------------------
 2 files changed, 37 insertions(+), 37 deletions(-)

diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir.h b/src/gallium/drivers/nouveau/codegen/nv50_ir.h
index 94e54bb..c864d56 100644
--- a/src/gallium/drivers/nouveau/codegen/nv50_ir.h
+++ b/src/gallium/drivers/nouveau/codegen/nv50_ir.h
@@ -1132,6 +1132,41 @@ private:
    void splitCommon(Instruction *, BasicBlock *, bool attach);
 };
 
+// DominatorTree implements an algorithm for finding immediate dominators,
+// as described by T. Lengauer & R. Tarjan.
+class DominatorTree : public Graph
+{
+public:
+   DominatorTree(Graph *cfg);
+   ~DominatorTree() { }
+
+   bool dominates(BasicBlock *, BasicBlock *);
+
+   void findDominanceFrontiers();
+
+private:
+   void build();
+   void buildDFS(Node *);
+
+   void squash(int);
+   inline void link(int, int);
+   inline int eval(int);
+
+   void debugPrint();
+
+   Graph *cfg;
+
+   Node **vert;
+   int *data;
+   const int count;
+
+   #define SEMI(i)     (data[(i) + 0 * count])
+   #define ANCESTOR(i) (data[(i) + 1 * count])
+   #define PARENT(i)   (data[(i) + 2 * count])
+   #define LABEL(i)    (data[(i) + 3 * count])
+   #define DOM(i)      (data[(i) + 4 * count])
+};
+
 class Function
 {
 public:
@@ -1171,7 +1206,7 @@ public:
 
    Graph cfg;
    Graph::Node *cfgExit;
-   Graph *domTree;
+   DominatorTree *domTree;
    Graph::Node call; // node in the call graph
 
    BasicBlock **bbArray; // BBs in emission order
diff --git a/src/gallium/drivers/nouveau/codegen/nv50_ir_ssa.cpp b/src/gallium/drivers/nouveau/codegen/nv50_ir_ssa.cpp
index 3d25ad9..9652b72 100644
--- a/src/gallium/drivers/nouveau/codegen/nv50_ir_ssa.cpp
+++ b/src/gallium/drivers/nouveau/codegen/nv50_ir_ssa.cpp
@@ -27,41 +27,6 @@ namespace nv50_ir {
 
 // Converts nv50 IR generated from TGSI to SSA form.
 
-// DominatorTree implements an algorithm for finding immediate dominators,
-// as described by T. Lengauer & R. Tarjan.
-class DominatorTree : public Graph
-{
-public:
-   DominatorTree(Graph *cfg);
-   ~DominatorTree() { }
-
-   bool dominates(BasicBlock *, BasicBlock *);
-
-   void findDominanceFrontiers();
-
-private:
-   void build();
-   void buildDFS(Node *);
-
-   void squash(int);
-   inline void link(int, int);
-   inline int eval(int);
-
-   void debugPrint();
-
-   Graph *cfg;
-
-   Node **vert;
-   int *data;
-   const int count;
-
-   #define SEMI(i)     (data[(i) + 0 * count])
-   #define ANCESTOR(i) (data[(i) + 1 * count])
-   #define PARENT(i)   (data[(i) + 2 * count])
-   #define LABEL(i)    (data[(i) + 3 * count])
-   #define DOM(i)      (data[(i) + 4 * count])
-};
-
 void DominatorTree::debugPrint()
 {
    for (int i = 0; i < count; ++i) {
@@ -326,7 +291,7 @@ Function::convertToSSA()
 
    // 1. create the dominator tree
    domTree = new DominatorTree(&cfg);
-   reinterpret_cast<DominatorTree *>(domTree)->findDominanceFrontiers();
+   domTree->findDominanceFrontiers();
 
    // 2. insert PHI functions
    DLList workList;
-- 
2.7.4



More information about the mesa-dev mailing list