1b1994897Sopenharmony_ci/**
2b1994897Sopenharmony_ci * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3b1994897Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4b1994897Sopenharmony_ci * you may not use this file except in compliance with the License.
5b1994897Sopenharmony_ci * You may obtain a copy of the License at
6b1994897Sopenharmony_ci *
7b1994897Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0
8b1994897Sopenharmony_ci *
9b1994897Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10b1994897Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11b1994897Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12b1994897Sopenharmony_ci * See the License for the specific language governing permissions and
13b1994897Sopenharmony_ci * limitations under the License.
14b1994897Sopenharmony_ci */
15b1994897Sopenharmony_ci
16b1994897Sopenharmony_ci#ifndef ASSEMBLER_ANNOTATION_H
17b1994897Sopenharmony_ci#define ASSEMBLER_ANNOTATION_H
18b1994897Sopenharmony_ci
19b1994897Sopenharmony_ci#include <cstddef>
20b1994897Sopenharmony_ci#include <memory>
21b1994897Sopenharmony_ci#include <string>
22b1994897Sopenharmony_ci#include <string_view>
23b1994897Sopenharmony_ci#include <type_traits>
24b1994897Sopenharmony_ci#include <variant>
25b1994897Sopenharmony_ci#include <vector>
26b1994897Sopenharmony_ci
27b1994897Sopenharmony_ci#include "assembly-type.h"
28b1994897Sopenharmony_ci
29b1994897Sopenharmony_ci#include "macros.h"
30b1994897Sopenharmony_ci
31b1994897Sopenharmony_cinamespace panda::pandasm {
32b1994897Sopenharmony_ci
33b1994897Sopenharmony_ciclass AnnotationElement;
34b1994897Sopenharmony_ci
35b1994897Sopenharmony_ciclass AnnotationData {
36b1994897Sopenharmony_cipublic:
37b1994897Sopenharmony_ci    AnnotationData(const std::string_view &record_name, std::vector<AnnotationElement> elements)
38b1994897Sopenharmony_ci        : record_name_(record_name), elements_(std::move(elements))
39b1994897Sopenharmony_ci    {
40b1994897Sopenharmony_ci    }
41b1994897Sopenharmony_ci
42b1994897Sopenharmony_ci    explicit AnnotationData(const std::string_view &record_name) : record_name_(record_name) {}
43b1994897Sopenharmony_ci
44b1994897Sopenharmony_ci    DEFAULT_MOVE_SEMANTIC(AnnotationData);
45b1994897Sopenharmony_ci    DEFAULT_COPY_SEMANTIC(AnnotationData);
46b1994897Sopenharmony_ci
47b1994897Sopenharmony_ci    ~AnnotationData() = default;
48b1994897Sopenharmony_ci
49b1994897Sopenharmony_ci    std::string GetName() const
50b1994897Sopenharmony_ci    {
51b1994897Sopenharmony_ci        return record_name_;
52b1994897Sopenharmony_ci    }
53b1994897Sopenharmony_ci
54b1994897Sopenharmony_ci    const std::vector<AnnotationElement> &GetElements() const
55b1994897Sopenharmony_ci    {
56b1994897Sopenharmony_ci        return elements_;
57b1994897Sopenharmony_ci    }
58b1994897Sopenharmony_ci
59b1994897Sopenharmony_ci    void AddElement(AnnotationElement &&element)
60b1994897Sopenharmony_ci    {
61b1994897Sopenharmony_ci        elements_.push_back(std::forward<AnnotationElement>(element));
62b1994897Sopenharmony_ci    }
63b1994897Sopenharmony_ci
64b1994897Sopenharmony_ci    void DeleteAnnotationElementByName(const std::string_view &annotation_elem_name);
65b1994897Sopenharmony_ci
66b1994897Sopenharmony_ci    void SetOrAddElementByIndex(size_t ele_idx, AnnotationElement &&element);
67b1994897Sopenharmony_ci
68b1994897Sopenharmony_ciprivate:
69b1994897Sopenharmony_ci    std::string record_name_;
70b1994897Sopenharmony_ci    std::vector<AnnotationElement> elements_;
71b1994897Sopenharmony_ci};
72b1994897Sopenharmony_ci
73b1994897Sopenharmony_ciclass ScalarValue;
74b1994897Sopenharmony_ciclass ArrayValue;
75b1994897Sopenharmony_ci
76b1994897Sopenharmony_ciclass Value {
77b1994897Sopenharmony_cipublic:
78b1994897Sopenharmony_ci    enum class Type {
79b1994897Sopenharmony_ci        U1,
80b1994897Sopenharmony_ci        I8,
81b1994897Sopenharmony_ci        U8,
82b1994897Sopenharmony_ci        I16,
83b1994897Sopenharmony_ci        U16,
84b1994897Sopenharmony_ci        I32,
85b1994897Sopenharmony_ci        U32,
86b1994897Sopenharmony_ci        I64,
87b1994897Sopenharmony_ci        U64,
88b1994897Sopenharmony_ci        F32,
89b1994897Sopenharmony_ci        F64,
90b1994897Sopenharmony_ci        STRING,
91b1994897Sopenharmony_ci        STRING_NULLPTR,
92b1994897Sopenharmony_ci        RECORD,
93b1994897Sopenharmony_ci        METHOD,
94b1994897Sopenharmony_ci        ENUM,
95b1994897Sopenharmony_ci        ANNOTATION,
96b1994897Sopenharmony_ci        ARRAY,
97b1994897Sopenharmony_ci        VOID,
98b1994897Sopenharmony_ci        METHOD_HANDLE,
99b1994897Sopenharmony_ci        LITERALARRAY,
100b1994897Sopenharmony_ci        UNKNOWN
101b1994897Sopenharmony_ci    };
102b1994897Sopenharmony_ci
103b1994897Sopenharmony_ci    static constexpr char GetTypeAsChar(Type t)
104b1994897Sopenharmony_ci    {
105b1994897Sopenharmony_ci        char type = '0';
106b1994897Sopenharmony_ci        switch (t) {
107b1994897Sopenharmony_ci            case Type::U1:
108b1994897Sopenharmony_ci                type = '1';
109b1994897Sopenharmony_ci                break;
110b1994897Sopenharmony_ci            case Type::I8:
111b1994897Sopenharmony_ci                type = '2';
112b1994897Sopenharmony_ci                break;
113b1994897Sopenharmony_ci            case Type::U8:
114b1994897Sopenharmony_ci                type = '3';
115b1994897Sopenharmony_ci                break;
116b1994897Sopenharmony_ci            case Type::I16:
117b1994897Sopenharmony_ci                type = '4';
118b1994897Sopenharmony_ci                break;
119b1994897Sopenharmony_ci            case Type::U16:
120b1994897Sopenharmony_ci                type = '5';
121b1994897Sopenharmony_ci                break;
122b1994897Sopenharmony_ci            case Type::I32:
123b1994897Sopenharmony_ci                type = '6';
124b1994897Sopenharmony_ci                break;
125b1994897Sopenharmony_ci            case Type::U32:
126b1994897Sopenharmony_ci                type = '7';
127b1994897Sopenharmony_ci                break;
128b1994897Sopenharmony_ci            case Type::I64:
129b1994897Sopenharmony_ci                type = '8';
130b1994897Sopenharmony_ci                break;
131b1994897Sopenharmony_ci            case Type::U64:
132b1994897Sopenharmony_ci                type = '9';
133b1994897Sopenharmony_ci                break;
134b1994897Sopenharmony_ci            case Type::F32:
135b1994897Sopenharmony_ci                type = 'A';
136b1994897Sopenharmony_ci                break;
137b1994897Sopenharmony_ci            case Type::F64:
138b1994897Sopenharmony_ci                type = 'B';
139b1994897Sopenharmony_ci                break;
140b1994897Sopenharmony_ci            case Type::STRING:
141b1994897Sopenharmony_ci                type = 'C';
142b1994897Sopenharmony_ci                break;
143b1994897Sopenharmony_ci            case Type::RECORD:
144b1994897Sopenharmony_ci                type = 'D';
145b1994897Sopenharmony_ci                break;
146b1994897Sopenharmony_ci            case Type::METHOD:
147b1994897Sopenharmony_ci                type = 'E';
148b1994897Sopenharmony_ci                break;
149b1994897Sopenharmony_ci            case Type::ENUM:
150b1994897Sopenharmony_ci                type = 'F';
151b1994897Sopenharmony_ci                break;
152b1994897Sopenharmony_ci            case Type::ANNOTATION:
153b1994897Sopenharmony_ci                type = 'G';
154b1994897Sopenharmony_ci                break;
155b1994897Sopenharmony_ci            case Type::ARRAY:
156b1994897Sopenharmony_ci                type = 'H';
157b1994897Sopenharmony_ci                break;
158b1994897Sopenharmony_ci            case Type::VOID:
159b1994897Sopenharmony_ci                type = 'I';
160b1994897Sopenharmony_ci                break;
161b1994897Sopenharmony_ci            case Type::METHOD_HANDLE:
162b1994897Sopenharmony_ci                type = 'J';
163b1994897Sopenharmony_ci                break;
164b1994897Sopenharmony_ci            case Type::STRING_NULLPTR:
165b1994897Sopenharmony_ci                type = '*';
166b1994897Sopenharmony_ci                break;
167b1994897Sopenharmony_ci            case Type::LITERALARRAY:
168b1994897Sopenharmony_ci                type = '#';
169b1994897Sopenharmony_ci                break;
170b1994897Sopenharmony_ci            case Type::UNKNOWN:
171b1994897Sopenharmony_ci            default:
172b1994897Sopenharmony_ci                type = '0';
173b1994897Sopenharmony_ci        }
174b1994897Sopenharmony_ci        return type;
175b1994897Sopenharmony_ci    }
176b1994897Sopenharmony_ci
177b1994897Sopenharmony_ci    static constexpr char GetArrayTypeAsChar(Type t)
178b1994897Sopenharmony_ci    {
179b1994897Sopenharmony_ci        char type = '0';
180b1994897Sopenharmony_ci        switch (t) {
181b1994897Sopenharmony_ci            case Type::U1:
182b1994897Sopenharmony_ci                type = 'K';
183b1994897Sopenharmony_ci                break;
184b1994897Sopenharmony_ci            case Type::I8:
185b1994897Sopenharmony_ci                type = 'L';
186b1994897Sopenharmony_ci                break;
187b1994897Sopenharmony_ci            case Type::U8:
188b1994897Sopenharmony_ci                type = 'M';
189b1994897Sopenharmony_ci                break;
190b1994897Sopenharmony_ci            case Type::I16:
191b1994897Sopenharmony_ci                type = 'N';
192b1994897Sopenharmony_ci                break;
193b1994897Sopenharmony_ci            case Type::U16:
194b1994897Sopenharmony_ci                type = 'O';
195b1994897Sopenharmony_ci                break;
196b1994897Sopenharmony_ci            case Type::I32:
197b1994897Sopenharmony_ci                type = 'P';
198b1994897Sopenharmony_ci                break;
199b1994897Sopenharmony_ci            case Type::U32:
200b1994897Sopenharmony_ci                type = 'Q';
201b1994897Sopenharmony_ci                break;
202b1994897Sopenharmony_ci            case Type::I64:
203b1994897Sopenharmony_ci                type = 'R';
204b1994897Sopenharmony_ci                break;
205b1994897Sopenharmony_ci            case Type::U64:
206b1994897Sopenharmony_ci                type = 'S';
207b1994897Sopenharmony_ci                break;
208b1994897Sopenharmony_ci            case Type::F32:
209b1994897Sopenharmony_ci                type = 'T';
210b1994897Sopenharmony_ci                break;
211b1994897Sopenharmony_ci            case Type::F64:
212b1994897Sopenharmony_ci                type = 'U';
213b1994897Sopenharmony_ci                break;
214b1994897Sopenharmony_ci            case Type::STRING:
215b1994897Sopenharmony_ci                type = 'V';
216b1994897Sopenharmony_ci                break;
217b1994897Sopenharmony_ci            case Type::RECORD:
218b1994897Sopenharmony_ci                type = 'W';
219b1994897Sopenharmony_ci                break;
220b1994897Sopenharmony_ci            case Type::METHOD:
221b1994897Sopenharmony_ci                type = 'X';
222b1994897Sopenharmony_ci                break;
223b1994897Sopenharmony_ci            case Type::ENUM:
224b1994897Sopenharmony_ci                type = 'Y';
225b1994897Sopenharmony_ci                break;
226b1994897Sopenharmony_ci            case Type::ANNOTATION:
227b1994897Sopenharmony_ci                type = 'Z';
228b1994897Sopenharmony_ci                break;
229b1994897Sopenharmony_ci            case Type::METHOD_HANDLE:
230b1994897Sopenharmony_ci                type = '@';
231b1994897Sopenharmony_ci                break;
232b1994897Sopenharmony_ci            case Type::UNKNOWN:
233b1994897Sopenharmony_ci            default:
234b1994897Sopenharmony_ci                type = '0';
235b1994897Sopenharmony_ci        }
236b1994897Sopenharmony_ci        return type;
237b1994897Sopenharmony_ci    }
238b1994897Sopenharmony_ci
239b1994897Sopenharmony_ci    static constexpr Type GetCharAsType(char c)
240b1994897Sopenharmony_ci    {
241b1994897Sopenharmony_ci        Type type = Type::UNKNOWN;
242b1994897Sopenharmony_ci        switch (c) {
243b1994897Sopenharmony_ci            case '1':
244b1994897Sopenharmony_ci                type = Type::U1;
245b1994897Sopenharmony_ci                break;
246b1994897Sopenharmony_ci            case '2':
247b1994897Sopenharmony_ci                type = Type::I8;
248b1994897Sopenharmony_ci                break;
249b1994897Sopenharmony_ci            case '3':
250b1994897Sopenharmony_ci                type = Type::U8;
251b1994897Sopenharmony_ci                break;
252b1994897Sopenharmony_ci            case '4':
253b1994897Sopenharmony_ci                type = Type::I16;
254b1994897Sopenharmony_ci                break;
255b1994897Sopenharmony_ci            case '5':
256b1994897Sopenharmony_ci                type = Type::U16;
257b1994897Sopenharmony_ci                break;
258b1994897Sopenharmony_ci            case '6':
259b1994897Sopenharmony_ci                type = Type::I32;
260b1994897Sopenharmony_ci                break;
261b1994897Sopenharmony_ci            case '7':
262b1994897Sopenharmony_ci                type = Type::U32;
263b1994897Sopenharmony_ci                break;
264b1994897Sopenharmony_ci            case '8':
265b1994897Sopenharmony_ci                type = Type::I64;
266b1994897Sopenharmony_ci                break;
267b1994897Sopenharmony_ci            case '9':
268b1994897Sopenharmony_ci                type = Type::U64;
269b1994897Sopenharmony_ci                break;
270b1994897Sopenharmony_ci            case 'A':
271b1994897Sopenharmony_ci                type = Type::F32;
272b1994897Sopenharmony_ci                break;
273b1994897Sopenharmony_ci            case 'B':
274b1994897Sopenharmony_ci                type = Type::F64;
275b1994897Sopenharmony_ci                break;
276b1994897Sopenharmony_ci            case 'C':
277b1994897Sopenharmony_ci                type = Type::STRING;
278b1994897Sopenharmony_ci                break;
279b1994897Sopenharmony_ci            case 'D':
280b1994897Sopenharmony_ci                type = Type::RECORD;
281b1994897Sopenharmony_ci                break;
282b1994897Sopenharmony_ci            case 'E':
283b1994897Sopenharmony_ci                type = Type::METHOD;
284b1994897Sopenharmony_ci                break;
285b1994897Sopenharmony_ci            case 'F':
286b1994897Sopenharmony_ci                type = Type::ENUM;
287b1994897Sopenharmony_ci                break;
288b1994897Sopenharmony_ci            case 'G':
289b1994897Sopenharmony_ci                type = Type::ANNOTATION;
290b1994897Sopenharmony_ci                break;
291b1994897Sopenharmony_ci            case 'H':
292b1994897Sopenharmony_ci                type = Type::ARRAY;
293b1994897Sopenharmony_ci                break;
294b1994897Sopenharmony_ci            case 'I':
295b1994897Sopenharmony_ci                type = Type::VOID;
296b1994897Sopenharmony_ci                break;
297b1994897Sopenharmony_ci            case 'J':
298b1994897Sopenharmony_ci                type = Type::METHOD_HANDLE;
299b1994897Sopenharmony_ci                break;
300b1994897Sopenharmony_ci            case '*':
301b1994897Sopenharmony_ci                type = Type::STRING_NULLPTR;
302b1994897Sopenharmony_ci                break;
303b1994897Sopenharmony_ci            case '#':
304b1994897Sopenharmony_ci                type = Type::LITERALARRAY;
305b1994897Sopenharmony_ci                break;
306b1994897Sopenharmony_ci            case '0':
307b1994897Sopenharmony_ci            default:
308b1994897Sopenharmony_ci                type = Type::UNKNOWN;
309b1994897Sopenharmony_ci        }
310b1994897Sopenharmony_ci        return type;
311b1994897Sopenharmony_ci    }
312b1994897Sopenharmony_ci
313b1994897Sopenharmony_ci    static constexpr Type GetCharAsArrayType(char c)
314b1994897Sopenharmony_ci    {
315b1994897Sopenharmony_ci        Type type = Type::UNKNOWN;
316b1994897Sopenharmony_ci        switch (c) {
317b1994897Sopenharmony_ci            case 'K':
318b1994897Sopenharmony_ci                type = Type::U1;
319b1994897Sopenharmony_ci                break;
320b1994897Sopenharmony_ci            case 'L':
321b1994897Sopenharmony_ci                type = Type::I8;
322b1994897Sopenharmony_ci                break;
323b1994897Sopenharmony_ci            case 'M':
324b1994897Sopenharmony_ci                type = Type::U8;
325b1994897Sopenharmony_ci                break;
326b1994897Sopenharmony_ci            case 'N':
327b1994897Sopenharmony_ci                type = Type::I16;
328b1994897Sopenharmony_ci                break;
329b1994897Sopenharmony_ci            case 'O':
330b1994897Sopenharmony_ci                type = Type::U16;
331b1994897Sopenharmony_ci                break;
332b1994897Sopenharmony_ci            case 'P':
333b1994897Sopenharmony_ci                type = Type::I32;
334b1994897Sopenharmony_ci                break;
335b1994897Sopenharmony_ci            case 'Q':
336b1994897Sopenharmony_ci                type = Type::U32;
337b1994897Sopenharmony_ci                break;
338b1994897Sopenharmony_ci            case 'R':
339b1994897Sopenharmony_ci                type = Type::I64;
340b1994897Sopenharmony_ci                break;
341b1994897Sopenharmony_ci            case 'S':
342b1994897Sopenharmony_ci                type = Type::U64;
343b1994897Sopenharmony_ci                break;
344b1994897Sopenharmony_ci            case 'T':
345b1994897Sopenharmony_ci                type = Type::F32;
346b1994897Sopenharmony_ci                break;
347b1994897Sopenharmony_ci            case 'U':
348b1994897Sopenharmony_ci                type = Type::F64;
349b1994897Sopenharmony_ci                break;
350b1994897Sopenharmony_ci            case 'V':
351b1994897Sopenharmony_ci                type = Type::STRING;
352b1994897Sopenharmony_ci                break;
353b1994897Sopenharmony_ci            case 'W':
354b1994897Sopenharmony_ci                type = Type::RECORD;
355b1994897Sopenharmony_ci                break;
356b1994897Sopenharmony_ci            case 'X':
357b1994897Sopenharmony_ci                type = Type::METHOD;
358b1994897Sopenharmony_ci                break;
359b1994897Sopenharmony_ci            case 'Y':
360b1994897Sopenharmony_ci                type = Type::ENUM;
361b1994897Sopenharmony_ci                break;
362b1994897Sopenharmony_ci            case 'Z':
363b1994897Sopenharmony_ci                type = Type::ANNOTATION;
364b1994897Sopenharmony_ci                break;
365b1994897Sopenharmony_ci            case '@':
366b1994897Sopenharmony_ci                type = Type::METHOD_HANDLE;
367b1994897Sopenharmony_ci                break;
368b1994897Sopenharmony_ci            case '#':
369b1994897Sopenharmony_ci                type = Type::LITERALARRAY;
370b1994897Sopenharmony_ci                break;
371b1994897Sopenharmony_ci            case '0':
372b1994897Sopenharmony_ci            default:
373b1994897Sopenharmony_ci                type = Type::UNKNOWN;
374b1994897Sopenharmony_ci        }
375b1994897Sopenharmony_ci        return type;
376b1994897Sopenharmony_ci    }
377b1994897Sopenharmony_ci
378b1994897Sopenharmony_ci    Type GetType() const
379b1994897Sopenharmony_ci    {
380b1994897Sopenharmony_ci        return type_;
381b1994897Sopenharmony_ci    }
382b1994897Sopenharmony_ci
383b1994897Sopenharmony_ci    bool IsArray() const
384b1994897Sopenharmony_ci    {
385b1994897Sopenharmony_ci        return type_ == Type::ARRAY;
386b1994897Sopenharmony_ci    }
387b1994897Sopenharmony_ci
388b1994897Sopenharmony_ci    ScalarValue *GetAsScalar();
389b1994897Sopenharmony_ci
390b1994897Sopenharmony_ci    const ScalarValue *GetAsScalar() const;
391b1994897Sopenharmony_ci
392b1994897Sopenharmony_ci    ArrayValue *GetAsArray();
393b1994897Sopenharmony_ci
394b1994897Sopenharmony_ci    const ArrayValue *GetAsArray() const;
395b1994897Sopenharmony_ci
396b1994897Sopenharmony_ci    virtual ~Value() = default;
397b1994897Sopenharmony_ci
398b1994897Sopenharmony_ci    DEFAULT_COPY_SEMANTIC(Value);
399b1994897Sopenharmony_ci    DEFAULT_MOVE_SEMANTIC(Value);
400b1994897Sopenharmony_ci
401b1994897Sopenharmony_ciprotected:
402b1994897Sopenharmony_ci    explicit Value(Type type) : type_(type) {}
403b1994897Sopenharmony_ci
404b1994897Sopenharmony_ciprivate:
405b1994897Sopenharmony_ci    Type type_;
406b1994897Sopenharmony_ci};
407b1994897Sopenharmony_ci
408b1994897Sopenharmony_ci// clang-format off
409b1994897Sopenharmony_ci
410b1994897Sopenharmony_citemplate <Value::Type value_type>
411b1994897Sopenharmony_cistruct ValueTypeHelper {
412b1994897Sopenharmony_ci    // Disable checks due to clang-tidy bug https://bugs.llvm.org/show_bug.cgi?id=40640
413b1994897Sopenharmony_ci    // NOLINTNEXTLINE(readability-magic-numbers)
414b1994897Sopenharmony_ci    using type = std::conditional_t<value_type == Value::Type::U1, uint8_t,
415b1994897Sopenharmony_ci                // NOLINTNEXTLINE(readability-magic-numbers)
416b1994897Sopenharmony_ci                std::conditional_t<value_type == Value::Type::I8, int8_t,
417b1994897Sopenharmony_ci                // NOLINTNEXTLINE(readability-magic-numbers)
418b1994897Sopenharmony_ci                std::conditional_t<value_type == Value::Type::U8, uint8_t,
419b1994897Sopenharmony_ci                // NOLINTNEXTLINE(readability-magic-numbers)
420b1994897Sopenharmony_ci                std::conditional_t<value_type == Value::Type::I16, int16_t,
421b1994897Sopenharmony_ci                // NOLINTNEXTLINE(readability-magic-numbers)
422b1994897Sopenharmony_ci                std::conditional_t<value_type == Value::Type::U16, uint16_t,
423b1994897Sopenharmony_ci                // NOLINTNEXTLINE(readability-magic-numbers)
424b1994897Sopenharmony_ci                std::conditional_t<value_type == Value::Type::I32, int32_t,
425b1994897Sopenharmony_ci                // NOLINTNEXTLINE(readability-magic-numbers)
426b1994897Sopenharmony_ci                std::conditional_t<value_type == Value::Type::U32, uint32_t,
427b1994897Sopenharmony_ci                // NOLINTNEXTLINE(readability-magic-numbers)
428b1994897Sopenharmony_ci                std::conditional_t<value_type == Value::Type::I64, int64_t,
429b1994897Sopenharmony_ci                // NOLINTNEXTLINE(readability-magic-numbers)
430b1994897Sopenharmony_ci                std::conditional_t<value_type == Value::Type::U64, uint64_t,
431b1994897Sopenharmony_ci                // NOLINTNEXTLINE(readability-magic-numbers)
432b1994897Sopenharmony_ci                std::conditional_t<value_type == Value::Type::F32, float,
433b1994897Sopenharmony_ci                // NOLINTNEXTLINE(readability-magic-numbers)
434b1994897Sopenharmony_ci                std::conditional_t<value_type == Value::Type::F64, double,
435b1994897Sopenharmony_ci                // NOLINTNEXTLINE(readability-magic-numbers)
436b1994897Sopenharmony_ci                std::conditional_t<value_type == Value::Type::STRING, std::string_view,
437b1994897Sopenharmony_ci                // NOLINTNEXTLINE(readability-magic-numbers)
438b1994897Sopenharmony_ci                std::conditional_t<value_type == Value::Type::STRING_NULLPTR, uint32_t,
439b1994897Sopenharmony_ci                // NOLINTNEXTLINE(readability-magic-numbers)
440b1994897Sopenharmony_ci                std::conditional_t<value_type == Value::Type::RECORD, pandasm::Type,
441b1994897Sopenharmony_ci                // NOLINTNEXTLINE(readability-magic-numbers)
442b1994897Sopenharmony_ci                std::conditional_t<value_type == Value::Type::METHOD, std::string_view,
443b1994897Sopenharmony_ci                // NOLINTNEXTLINE(readability-magic-numbers)
444b1994897Sopenharmony_ci                std::conditional_t<value_type == Value::Type::ENUM, std::string_view,
445b1994897Sopenharmony_ci                // NOLINTNEXTLINE(readability-magic-numbers)
446b1994897Sopenharmony_ci                std::conditional_t<value_type == Value::Type::ANNOTATION, AnnotationData,
447b1994897Sopenharmony_ci                // NOLINTNEXTLINE(readability-magic-numbers)
448b1994897Sopenharmony_ci                std::conditional_t<value_type == Value::Type::LITERALARRAY, std::string_view,
449b1994897Sopenharmony_ci                void>>>>>>>>>>>>>>>>>>;
450b1994897Sopenharmony_ci};
451b1994897Sopenharmony_ci
452b1994897Sopenharmony_ci// clang-format on
453b1994897Sopenharmony_ci
454b1994897Sopenharmony_citemplate <Value::Type type>
455b1994897Sopenharmony_ciusing ValueTypeHelperT = typename ValueTypeHelper<type>::type;
456b1994897Sopenharmony_ci
457b1994897Sopenharmony_ciclass ScalarValue : public Value {
458b1994897Sopenharmony_cipublic:
459b1994897Sopenharmony_ci    template <Value::Type type>
460b1994897Sopenharmony_ci    // Disable checks due to clang-tidy bug https://bugs.llvm.org/show_bug.cgi?id=40640
461b1994897Sopenharmony_ci    // NOLINTNEXTLINE(readability-magic-numbers)
462b1994897Sopenharmony_ci    static ScalarValue Create(ValueTypeHelperT<type> value)
463b1994897Sopenharmony_ci    {
464b1994897Sopenharmony_ci        // NOLINTNEXTLINE(readability-magic-numbers)
465b1994897Sopenharmony_ci        using T = ValueTypeHelperT<type>;
466b1994897Sopenharmony_ci        // Disable checks due to clang-tidy bug https://bugs.llvm.org/show_bug.cgi?id=32203
467b1994897Sopenharmony_ci        // NOLINTNEXTLINE(readability-braces-around-statements, hicpp-braces-around-statements)
468b1994897Sopenharmony_ci        if constexpr (std::is_integral_v<T>) {  // NOLINT(bugprone-suspicious-semicolon)
469b1994897Sopenharmony_ci            // NOLINTNEXTLINE(readability-magic-numbers)
470b1994897Sopenharmony_ci            return ScalarValue(type, static_cast<uint64_t>(value));
471b1994897Sopenharmony_ci        }
472b1994897Sopenharmony_ci
473b1994897Sopenharmony_ci        // NOLINTNEXTLINE(readability-braces-around-statements, hicpp-braces-around-statements)
474b1994897Sopenharmony_ci        if constexpr (!std::is_integral_v<T>) {  // NOLINT(bugprone-suspicious-semicolon)
475b1994897Sopenharmony_ci            // NOLINTNEXTLINE(readability-magic-numbers)
476b1994897Sopenharmony_ci            return ScalarValue(type, value);
477b1994897Sopenharmony_ci        }
478b1994897Sopenharmony_ci    }
479b1994897Sopenharmony_ci
480b1994897Sopenharmony_ci    template <class T>
481b1994897Sopenharmony_ci    T GetValue() const
482b1994897Sopenharmony_ci    {
483b1994897Sopenharmony_ci        // Disable checks due to clang-tidy bug https://bugs.llvm.org/show_bug.cgi?id=32203
484b1994897Sopenharmony_ci        // NOLINTNEXTLINE(readability-braces-around-statements, hicpp-braces-around-statements)
485b1994897Sopenharmony_ci        if constexpr (std::is_integral_v<T>) {  // NOLINT(bugprone-suspicious-semicolon)
486b1994897Sopenharmony_ci            return static_cast<T>(std::get<uint64_t>(value_));
487b1994897Sopenharmony_ci        }
488b1994897Sopenharmony_ci
489b1994897Sopenharmony_ci        // NOLINTNEXTLINE(readability-braces-around-statements, hicpp-braces-around-statements)
490b1994897Sopenharmony_ci        if constexpr (!std::is_integral_v<T>) {  // NOLINT(bugprone-suspicious-semicolon)
491b1994897Sopenharmony_ci            return std::get<T>(value_);
492b1994897Sopenharmony_ci        }
493b1994897Sopenharmony_ci    }
494b1994897Sopenharmony_ci
495b1994897Sopenharmony_ci    DEFAULT_MOVE_SEMANTIC(ScalarValue);
496b1994897Sopenharmony_ci    DEFAULT_COPY_SEMANTIC(ScalarValue);
497b1994897Sopenharmony_ci
498b1994897Sopenharmony_ci    ~ScalarValue() override = default;
499b1994897Sopenharmony_ci
500b1994897Sopenharmony_ciprivate:
501b1994897Sopenharmony_ci    ScalarValue(Type type, uint64_t value) : Value(type), value_(value) {}
502b1994897Sopenharmony_ci
503b1994897Sopenharmony_ci    ScalarValue(Type type, float value) : Value(type), value_(value) {}
504b1994897Sopenharmony_ci
505b1994897Sopenharmony_ci    ScalarValue(Type type, double value) : Value(type), value_(value) {}
506b1994897Sopenharmony_ci
507b1994897Sopenharmony_ci    ScalarValue(Type type, const std::string_view &value) : Value(type), value_(std::string(value)) {}
508b1994897Sopenharmony_ci
509b1994897Sopenharmony_ci    ScalarValue(Type type, pandasm::Type value) : Value(type), value_(std::move(value)) {}
510b1994897Sopenharmony_ci
511b1994897Sopenharmony_ci    ScalarValue(Type type, AnnotationData &value) : Value(type), value_(value) {}
512b1994897Sopenharmony_ci
513b1994897Sopenharmony_ci    std::variant<uint64_t, float, double, std::string, pandasm::Type, AnnotationData> value_;
514b1994897Sopenharmony_ci};
515b1994897Sopenharmony_ci
516b1994897Sopenharmony_ciclass ArrayValue : public Value {
517b1994897Sopenharmony_cipublic:
518b1994897Sopenharmony_ci    ArrayValue(Type component_type, std::vector<ScalarValue> values)
519b1994897Sopenharmony_ci        : Value(Type::ARRAY), component_type_(component_type), values_(std::move(values))
520b1994897Sopenharmony_ci    {
521b1994897Sopenharmony_ci    }
522b1994897Sopenharmony_ci
523b1994897Sopenharmony_ci    DEFAULT_MOVE_SEMANTIC(ArrayValue);
524b1994897Sopenharmony_ci    DEFAULT_COPY_SEMANTIC(ArrayValue);
525b1994897Sopenharmony_ci
526b1994897Sopenharmony_ci    ~ArrayValue() override = default;
527b1994897Sopenharmony_ci
528b1994897Sopenharmony_ci    const std::vector<ScalarValue> &GetValues() const
529b1994897Sopenharmony_ci    {
530b1994897Sopenharmony_ci        return values_;
531b1994897Sopenharmony_ci    }
532b1994897Sopenharmony_ci
533b1994897Sopenharmony_ci    Type GetComponentType() const
534b1994897Sopenharmony_ci    {
535b1994897Sopenharmony_ci        return component_type_;
536b1994897Sopenharmony_ci    }
537b1994897Sopenharmony_ci
538b1994897Sopenharmony_ciprivate:
539b1994897Sopenharmony_ci    Type component_type_;
540b1994897Sopenharmony_ci    std::vector<ScalarValue> values_;
541b1994897Sopenharmony_ci};
542b1994897Sopenharmony_ci
543b1994897Sopenharmony_ciclass AnnotationElement {
544b1994897Sopenharmony_cipublic:
545b1994897Sopenharmony_ci    AnnotationElement(const std::string_view &name, std::unique_ptr<Value> value)
546b1994897Sopenharmony_ci        : name_(name), value_(std::move(value)) {}
547b1994897Sopenharmony_ci
548b1994897Sopenharmony_ci    AnnotationElement(const AnnotationElement &ann_elem);
549b1994897Sopenharmony_ci    AnnotationElement &operator=(const AnnotationElement &ann_elem);
550b1994897Sopenharmony_ci    DEFAULT_MOVE_SEMANTIC(AnnotationElement);
551b1994897Sopenharmony_ci    ~AnnotationElement() = default;
552b1994897Sopenharmony_ci
553b1994897Sopenharmony_ci    std::string GetName() const
554b1994897Sopenharmony_ci    {
555b1994897Sopenharmony_ci        return name_;
556b1994897Sopenharmony_ci    }
557b1994897Sopenharmony_ci
558b1994897Sopenharmony_ci    Value *GetValue() const
559b1994897Sopenharmony_ci    {
560b1994897Sopenharmony_ci        return value_.get();
561b1994897Sopenharmony_ci    }
562b1994897Sopenharmony_ci
563b1994897Sopenharmony_ci    static std::string TypeToString(Value::Type type);
564b1994897Sopenharmony_ci
565b1994897Sopenharmony_ciprivate:
566b1994897Sopenharmony_ci    std::string name_;
567b1994897Sopenharmony_ci    std::unique_ptr<Value> value_;
568b1994897Sopenharmony_ci};
569b1994897Sopenharmony_ci
570b1994897Sopenharmony_ci}  // namespace panda::pandasm
571b1994897Sopenharmony_ci
572b1994897Sopenharmony_ci#endif  // ASSEMBLER_ANNOTATION_H
573