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