1/* -*- c++ -*- */
2/*
3 * Copyright © 2010 Intel Corporation
4 *
5 * Permission is hereby granted, free of charge, to any person obtaining a
6 * copy of this software and associated documentation files (the "Software"),
7 * to deal in the Software without restriction, including without limitation
8 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9 * and/or sell copies of the Software, and to permit persons to whom the
10 * Software is furnished to do so, subject to the following conditions:
11 *
12 * The above copyright notice and this permission notice (including the next
13 * paragraph) shall be included in all copies or substantial portions of the
14 * Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
23 */
24
25#pragma once
26#ifndef GLSL_SYMBOL_TABLE
27#define GLSL_SYMBOL_TABLE
28
29#include <new>
30
31extern "C" {
32#include "program/symbol_table.h"
33}
34#include "ir.h"
35#include "glsl_types.h"
36
37class symbol_table_entry;
38
39/**
40 * Facade class for _mesa_symbol_table
41 *
42 * Wraps the existing \c _mesa_symbol_table data structure to enforce some
43 * type safe and some symbol table invariants.
44 */
45struct glsl_symbol_table {
46private:
47   static void
48   _glsl_symbol_table_destructor (glsl_symbol_table *table)
49   {
50      table->~glsl_symbol_table();
51   }
52
53public:
54   /* Callers of this ralloc-based new need not call delete. It's
55    * easier to just ralloc_free 'ctx' (or any of its ancestors). */
56   static void* operator new(size_t size, void *ctx)
57   {
58      void *table;
59
60      table = ralloc_size(ctx, size);
61      assert(table != NULL);
62
63      ralloc_set_destructor(table, (void (*)(void*)) _glsl_symbol_table_destructor);
64
65      return table;
66   }
67
68   /* If the user *does* call delete, that's OK, we will just
69    * ralloc_free in that case. Here, C++ will have already called the
70    * destructor so tell ralloc not to do that again. */
71   static void operator delete(void *table)
72   {
73      ralloc_set_destructor(table, NULL);
74      ralloc_free(table);
75   }
76
77   glsl_symbol_table();
78   ~glsl_symbol_table();
79
80   unsigned int language_version;
81
82   void push_scope();
83   void pop_scope();
84
85   /**
86    * Determine whether a name was declared at the current scope
87    */
88   bool name_declared_this_scope(const char *name);
89
90   /**
91    * \name Methods to add symbols to the table
92    *
93    * There is some temptation to rename all these functions to \c add_symbol
94    * or similar.  However, this breaks symmetry with the getter functions and
95    * reduces the clarity of the intention of code that uses these methods.
96    */
97   /*@{*/
98   bool add_variable(ir_variable *v);
99   bool add_type(const char *name, const glsl_type *t);
100   bool add_function(ir_function *f);
101   bool add_uniform_block(struct gl_uniform_block *u);
102   /*@}*/
103
104   /**
105    * Add an function at global scope without checking for scoping conflicts.
106    */
107   void add_global_function(ir_function *f);
108
109   /**
110    * \name Methods to get symbols from the table
111    */
112   /*@{*/
113   ir_variable *get_variable(const char *name);
114   const glsl_type *get_type(const char *name);
115   ir_function *get_function(const char *name);
116   /*@}*/
117
118private:
119   symbol_table_entry *get_entry(const char *name);
120
121   struct _mesa_symbol_table *table;
122   void *mem_ctx;
123};
124
125#endif /* GLSL_SYMBOL_TABLE */
126