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