| // Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| #include <iostream> |
| |
| #include "vm/compiler/runtime_api.h" |
| #include "vm/compiler/runtime_offsets_list.h" |
| #include "vm/dart_entry.h" |
| #include "vm/longjump.h" |
| #include "vm/native_arguments.h" |
| #include "vm/native_entry.h" |
| #include "vm/object.h" |
| #include "vm/object_store.h" |
| #include "vm/runtime_entry.h" |
| #include "vm/symbols.h" |
| #include "vm/timeline.h" |
| |
| #if defined(TARGET_ARCH_ARM) |
| #define ARCH_DEF "defined(TARGET_ARCH_ARM)" |
| #elif defined(TARGET_ARCH_X64) |
| #define ARCH_DEF "defined(TARGET_ARCH_X64)" |
| #elif defined(TARGET_ARCH_IA32) |
| #define ARCH_DEF "defined(TARGET_ARCH_IA32)" |
| #elif defined(TARGET_ARCH_ARM64) |
| #define ARCH_DEF "defined(TARGET_ARCH_ARM64)" |
| #elif defined(TARGET_ARCH_DBC) && defined(TARGET_ARCH_IS_32_BIT) |
| #define ARCH_DEF "defined(TARGET_ARCH_DBC) && defined(TARGET_ARCH_IS_32_BIT)" |
| #elif defined(TARGET_ARCH_DBC) && defined(TARGET_ARCH_IS_64_BIT) |
| #define ARCH_DEF "defined(TARGET_ARCH_DBC) && defined(TARGET_ARCH_IS_64_BIT)" |
| #else |
| #error Unknown architecture |
| #endif |
| |
| namespace dart { |
| |
| void Assert::Fail(const char* format, ...) { |
| abort(); |
| } |
| |
| class OffsetsExtractor : public AllStatic { |
| public: |
| static void DumpOffsets() { |
| #define PRINT_FIELD_OFFSET(Class, Name) \ |
| std::cout << "static constexpr dart::compiler::target::word " #Class \ |
| "_" #Name " = " \ |
| << Class::Name() << ";\n"; |
| |
| #define PRINT_ARRAY_LAYOUT(Class, Name) \ |
| std::cout << "static constexpr dart::compiler::target::word " #Class \ |
| "_elements_start_offset = " \ |
| << Class::ArrayLayout::elements_start_offset() << ";\n"; \ |
| std::cout << "static constexpr dart::compiler::target::word " #Class \ |
| "_element_size = " \ |
| << Class::ArrayLayout::kElementSize << ";\n"; |
| |
| #define PRINT_ARRAY_STRUCTFIELD_OFFSET(Class, Name, ElementOffsetName, \ |
| FieldOffset) |
| |
| #define PRINT_SIZEOF(Class, Name, What) \ |
| std::cout << "static constexpr dart::compiler::target::word " #Class \ |
| "_" #Name " = " \ |
| << sizeof(What) << ";\n"; |
| |
| #define PRINT_RANGE(Class, Name, Type, First, Last, Filter) \ |
| { \ |
| auto filter = Filter; \ |
| bool comma = false; \ |
| std::cout << "static constexpr dart::compiler::target::word " #Class \ |
| "_" #Name "[] = {"; \ |
| for (intptr_t i = static_cast<intptr_t>(First); \ |
| i <= static_cast<intptr_t>(Last); i++) { \ |
| auto v = static_cast<Type>(i); \ |
| std::cout << (comma ? ", " : "") << (filter(v) ? Class::Name(v) : -1); \ |
| comma = true; \ |
| } \ |
| std::cout << "};\n"; \ |
| } |
| |
| #define PRINT_CONSTANT(Class, Name) \ |
| std::cout << "static constexpr dart::compiler::target::word " #Class \ |
| "_" #Name " = " \ |
| << Class::Name << ";\n"; |
| |
| #define PRECOMP_NO_CHECK(Code) Code |
| |
| OFFSETS_LIST(PRINT_FIELD_OFFSET, PRINT_ARRAY_LAYOUT, |
| PRINT_ARRAY_STRUCTFIELD_OFFSET, PRINT_SIZEOF, PRINT_RANGE, |
| PRINT_CONSTANT, PRECOMP_NO_CHECK) |
| |
| #undef PRINT_FIELD_OFFSET |
| #undef PRINT_ARRAY_LAYOUT |
| #undef PRINT_ARRAY_STRUCTFIELD_OFFSET |
| #undef PRINT_SIZEOF |
| #undef PRINT_RANGE |
| #undef PRINT_CONSTANT |
| #undef PRECOMP_NO_CHECK |
| } |
| }; |
| |
| } // namespace dart |
| |
| int main(int argc, char* argv[]) { |
| std::cout << "#if " << ARCH_DEF << std::endl; |
| dart::OffsetsExtractor::DumpOffsets(); |
| std::cout << "#endif // " << ARCH_DEF << std::endl; |
| return 0; |
| } |