• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2016 Google Inc.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 //     http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 #ifndef SOURCE_OPT_SET_SPEC_CONSTANT_DEFAULT_VALUE_PASS_H_
16 #define SOURCE_OPT_SET_SPEC_CONSTANT_DEFAULT_VALUE_PASS_H_
17 
18 #include <memory>
19 #include <string>
20 #include <unordered_map>
21 #include <utility>
22 #include <vector>
23 
24 #include "source/opt/ir_context.h"
25 #include "source/opt/module.h"
26 #include "source/opt/pass.h"
27 
28 namespace spvtools {
29 namespace opt {
30 
31 // See optimizer.hpp for documentation.
32 class SetSpecConstantDefaultValuePass : public Pass {
33  public:
34   using SpecIdToValueStrMap = std::unordered_map<uint32_t, std::string>;
35   using SpecIdToValueBitPatternMap =
36       std::unordered_map<uint32_t, std::vector<uint32_t>>;
37   using SpecIdToInstMap = std::unordered_map<uint32_t, Instruction*>;
38 
39   // Constructs a pass instance with a map from spec ids to default values
40   // in the form of string.
SetSpecConstantDefaultValuePass(const SpecIdToValueStrMap & default_values)41   explicit SetSpecConstantDefaultValuePass(
42       const SpecIdToValueStrMap& default_values)
43       : spec_id_to_value_str_(default_values),
44         spec_id_to_value_bit_pattern_() {}
SetSpecConstantDefaultValuePass(SpecIdToValueStrMap && default_values)45   explicit SetSpecConstantDefaultValuePass(SpecIdToValueStrMap&& default_values)
46       : spec_id_to_value_str_(std::move(default_values)),
47         spec_id_to_value_bit_pattern_() {}
48 
49   // Constructs a pass instance with a map from spec ids to default values in
50   // the form of bit pattern.
SetSpecConstantDefaultValuePass(const SpecIdToValueBitPatternMap & default_values)51   explicit SetSpecConstantDefaultValuePass(
52       const SpecIdToValueBitPatternMap& default_values)
53       : spec_id_to_value_str_(),
54         spec_id_to_value_bit_pattern_(default_values) {}
SetSpecConstantDefaultValuePass(SpecIdToValueBitPatternMap && default_values)55   explicit SetSpecConstantDefaultValuePass(
56       SpecIdToValueBitPatternMap&& default_values)
57       : spec_id_to_value_str_(),
58         spec_id_to_value_bit_pattern_(std::move(default_values)) {}
59 
name()60   const char* name() const override { return "set-spec-const-default-value"; }
61   Status Process() override;
62 
63   // Parses the given null-terminated C string to get a mapping from Spec Id to
64   // default value strings. Returns a unique pointer of the mapping from spec
65   // ids to spec constant default value strings built from the given |str| on
66   // success. Returns a nullptr if the given string is not valid for building
67   // the mapping.
68   // A valid string for building the mapping should follow the rule below:
69   //
70   //  "<spec id A>:<default value for A> <spec id B>:<default value for B> ..."
71   //  Example:
72   //    "200:0x11   201:3.14   202:1.4728"
73   //
74   //  Entries are separated with blank spaces (i.e.:' ', '\n', '\r', '\t',
75   //  '\f', '\v'). Each entry corresponds to a Spec Id and default value pair.
76   //  Multiple spaces between, before or after entries are allowed. However,
77   //  spaces are not allowed within spec id or the default value string because
78   //  spaces are always considered as delimiter to separate entries.
79   //
80   //  In each entry, the spec id and value string is separated by ':'. Missing
81   //  ':' in any entry is invalid. And it is invalid to have blank spaces in
82   //  between the spec id and ':' or the default value and ':'.
83   //
84   //  <spec id>: specifies the spec id value.
85   //    The text must represent a valid uint32_t number.
86   //    Hex format with '0x' prefix is allowed.
87   //    Empty <spec id> is not allowed.
88   //    One spec id value can only be defined once, multiple default values
89   //      defined for the same spec id is not allowed. Spec ids with same value
90   //      but different formats (e.g. 0x100 and 256) are considered the same.
91   //
92   //  <default value>: the default value string.
93   //    Spaces before and after default value text is allowed.
94   //    Spaces within the text is not allowed.
95   //    Empty <default value> is not allowed.
96   static std::unique_ptr<SpecIdToValueStrMap> ParseDefaultValuesString(
97       const char* str);
98 
99  private:
100   // The mappings from spec ids to default values. Two maps are defined here,
101   // each to be used for one specific form of the default values. Only one of
102   // them will be populated in practice.
103 
104   // The mapping from spec ids to their string-form default values to be set.
105   const SpecIdToValueStrMap spec_id_to_value_str_;
106   // The mapping from spec ids to their bitpattern-form default values to be
107   // set.
108   const SpecIdToValueBitPatternMap spec_id_to_value_bit_pattern_;
109 };
110 
111 }  // namespace opt
112 }  // namespace spvtools
113 
114 #endif  // SOURCE_OPT_SET_SPEC_CONSTANT_DEFAULT_VALUE_PASS_H_
115