1 // -*- mode: C++ -*-
2 //
3 // Copyright (c) 2008, 2009, 2010, 2011, 2013, 2015, 2017 The University of Utah
4 // All rights reserved.
5 //
6 // This file is part of `csmith', a random generator of C programs.
7 //
8 // Redistribution and use in source and binary forms, with or without
9 // modification, are permitted provided that the following conditions are met:
10 //
11 //   * Redistributions of source code must retain the above copyright notice,
12 //     this list of conditions and the following disclaimer.
13 //
14 //   * Redistributions in binary form must reproduce the above copyright
15 //     notice, this list of conditions and the following disclaimer in the
16 //     documentation and/or other materials provided with the distribution.
17 //
18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 // ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
22 // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23 // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24 // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26 // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27 // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28 // POSSIBILITY OF SUCH DAMAGE.
29 
30 #ifndef CVQUALIFIERS_H
31 #define CVQUALIFIERS_H
32 
33 #include <vector>
34 #include <string>
35 using namespace std;
36 
37 #include "Effect.h"
38 class Type;
39 class CGContext;
40 
41 class CVQualifiers
42 {
43 public:
44 	CVQualifiers(void);
45 	CVQualifiers(bool wild, bool accept_stricter);
46 	CVQualifiers(const vector<bool>& isConsts, const vector<bool>& isVolatiles);
47 	virtual ~CVQualifiers();
48 
49 	CVQualifiers(const CVQualifiers &qfer);
50 	CVQualifiers &operator=(const CVQualifiers &qfer);
51 
is_const(void)52 	bool is_const(void) const { return is_const_after_deref(0);}
is_volatile(void)53 	bool is_volatile(void) const { return is_volatile_after_deref(0); }
is_storage_const(void)54 	bool is_storage_const(void) const { return is_consts[0];}
is_storage_volatile(void)55 	bool is_storage_volatile(void) const { return is_volatiles[0];}
56 	bool is_const_after_deref(int deref_level) const;
57 	bool is_volatile_after_deref(int deref_level) const;
58 	void set_const(bool is_const, int pos=0);
59 	void set_volatile(bool is_volatile, int pos=0);
60 	void restrict(Effect::Access access, const CGContext& cg_context);
61 
62 	bool stricter_than(const CVQualifiers& qfer) const;
63 
64 	bool match(const CVQualifiers& qfer) const;
65 	bool match_indirect(const CVQualifiers& qfer) const;
66 
get_consts(void)67 	const vector<bool>& get_consts(void) const { return is_consts;}
get_volatiles(void)68 	const vector<bool>& get_volatiles(void) const { return is_volatiles;}
69 	CVQualifiers random_qualifiers(bool no_volatile, Effect::Access access, const CGContext &cg_context) const;
70 	CVQualifiers random_loose_qualifiers(bool no_volatile, Effect::Access access, const CGContext &cg_context) const;
71 	static void make_scalar_volatiles(std::vector<bool> &volatiles);
72 	static void make_scalar_consts(std::vector<bool> &consts);
73 	static CVQualifiers random_qualifiers(const Type* t, Effect::Access access,
74 		const CGContext &cg_context, bool no_volatile);
75 	static CVQualifiers random_qualifiers(const Type* t, Effect::Access access,
76 		const CGContext &cg_context, bool no_volatile, unsigned int const_prob, unsigned int volatile_prob);
77 	static CVQualifiers random_qualifiers(const Type* t);
78 	static CVQualifiers random_qualifiers(const Type* t, unsigned int const_prob, unsigned int volatile_prob);
79 
80 	static void get_all_qualifiers(std::vector<CVQualifiers> &quals,
81 			unsigned int const_prob, unsigned int volatile_prob);
82 
83 	void add_qualifiers(bool is_const, bool is_volatile);
84 	CVQualifiers random_add_qualifiers(bool no_volatile) const;
85 	void remove_qualifiers(int len);
86 	CVQualifiers indirect_qualifiers(int level) const;
87 
88 	bool sanity_check(const Type* t) const;
89 	void output_qualified_type(const Type* t, std::ostream &out) const;
90 	void output() const;
91 	void OutputFirstQuals(std::ostream &out) const;
92 
93 	bool wildcard;
94 	bool accept_stricter;
95 private:
96 	// Type qualifiers.
97 	vector<bool> is_consts;
98 	vector<bool> is_volatiles;
99 
100 	vector<bool> random_stricter_consts(void) const;
101 	vector<bool> random_stricter_volatiles(void) const;
102 	vector<bool> random_looser_consts(void) const;
103 	vector<bool> random_looser_volatiles(void) const;
104 };
105 
106 #endif // CVQUALIFIERS_H
107