9af507e0f5
Previously, compiler::target::Foo::InstanceSize(intptr_t length) definitions were hand-written and compiler::target::Foo::InstanceSize() were often defined using the size of UntaggedFoo for array-like objects. This results in an unnecessary code duplication and discrepancy between Foo::InstanceSize() which returns 0 and compiler::target::Foo::InstanceSize() which returns size of the header. This change adds ARRAY_SIZEOF variant to runtime_offsets_list.h and switches array-like objects to auto-generated InstanceSize methods. Also, this change strengthens assertions around host and target values of InstanceSize() and NextFieldOffset() being the same unless DART_PRECOMPILER is defined (which may do cross-compilation). Stronger assertions flushed out a few discrepancies between runtime_api.h and object.h, which are also fixed in this change. TEST=ci Change-Id: I9f67c6a71b9300af5e656fdc70f6a3e341c1d029 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/196345 Commit-Queue: Alexander Markov <alexmarkov@google.com> Reviewed-by: Tess Strickland <sstrickl@google.com>
169 lines
7.4 KiB
C++
169 lines
7.4 KiB
C++
// 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_api_state.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_CPU "defined(TARGET_ARCH_ARM)"
|
|
#elif defined(TARGET_ARCH_X64)
|
|
#define ARCH_DEF_CPU "defined(TARGET_ARCH_X64)"
|
|
#elif defined(TARGET_ARCH_IA32)
|
|
#define ARCH_DEF_CPU "defined(TARGET_ARCH_IA32)"
|
|
#elif defined(TARGET_ARCH_ARM64)
|
|
#define ARCH_DEF_CPU "defined(TARGET_ARCH_ARM64)"
|
|
#else
|
|
#error Unknown architecture
|
|
#endif
|
|
|
|
#if defined(DART_COMPRESSED_POINTERS)
|
|
#define ARCH_DEF ARCH_DEF_CPU " && defined(DART_COMPRESSED_POINTERS)"
|
|
#else
|
|
#define ARCH_DEF ARCH_DEF_CPU " && !defined(DART_COMPRESSED_POINTERS)"
|
|
#endif
|
|
|
|
namespace dart {
|
|
|
|
void Assert::Fail(const char* format, ...) {
|
|
abort();
|
|
}
|
|
|
|
class OffsetsExtractor : public AllStatic {
|
|
public:
|
|
static void DumpOffsets() {
|
|
// Currently we have two different axes for offset generation:
|
|
//
|
|
// * Target architecture
|
|
// * DART_PRECOMPILED_RUNTIME (i.e, AOT vs. JIT)
|
|
//
|
|
// TODO(dartbug.com/43646): Add DART_PRECOMPILER as another axis.
|
|
|
|
// These macros don't use any special constants, just method calls, so no
|
|
// output.
|
|
#define PRINT_ARRAY_SIZEOF(Class, Name, ElementOffset)
|
|
#define PRINT_PAYLOAD_SIZEOF(Class, Name, HeaderSize)
|
|
|
|
#if defined(DART_PRECOMPILED_RUNTIME)
|
|
|
|
#define PRINT_FIELD_OFFSET(Class, Name) \
|
|
std::cout << "static constexpr dart::compiler::target::word AOT_" #Class \
|
|
"_" #Name " = " \
|
|
<< Class::Name() << ";\n";
|
|
|
|
#define PRINT_ARRAY_LAYOUT(Class, Name) \
|
|
std::cout << "static constexpr dart::compiler::target::word AOT_" #Class \
|
|
"_elements_start_offset = " \
|
|
<< Class::ArrayTraits::elements_start_offset() << ";\n"; \
|
|
std::cout << "static constexpr dart::compiler::target::word AOT_" #Class \
|
|
"_element_size = " \
|
|
<< Class::ArrayTraits::kElementSize << ";\n";
|
|
|
|
#define PRINT_SIZEOF(Class, Name, What) \
|
|
std::cout << "static constexpr dart::compiler::target::word AOT_" #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 AOT_" #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 AOT_" #Class \
|
|
"_" #Name " = " \
|
|
<< Class::Name << ";\n";
|
|
|
|
#else // defined(DART_PRECOMPILED_RUNTIME)
|
|
|
|
#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::ArrayTraits::elements_start_offset() << ";\n"; \
|
|
std::cout << "static constexpr dart::compiler::target::word " #Class \
|
|
"_element_size = " \
|
|
<< Class::ArrayTraits::kElementSize << ";\n";
|
|
|
|
#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";
|
|
|
|
JIT_OFFSETS_LIST(PRINT_FIELD_OFFSET, PRINT_ARRAY_LAYOUT, PRINT_SIZEOF,
|
|
PRINT_ARRAY_SIZEOF, PRINT_PAYLOAD_SIZEOF, PRINT_RANGE,
|
|
PRINT_CONSTANT)
|
|
|
|
#endif // defined(DART_PRECOMPILED_RUNTIME)
|
|
|
|
COMMON_OFFSETS_LIST(PRINT_FIELD_OFFSET, PRINT_ARRAY_LAYOUT, PRINT_SIZEOF,
|
|
PRINT_ARRAY_SIZEOF, PRINT_PAYLOAD_SIZEOF, PRINT_RANGE,
|
|
PRINT_CONSTANT)
|
|
|
|
#undef PRINT_FIELD_OFFSET
|
|
#undef PRINT_ARRAY_LAYOUT
|
|
#undef PRINT_SIZEOF
|
|
#undef PRINT_RANGE
|
|
#undef PRINT_CONSTANT
|
|
#undef PRINT_ARRAY_SIZEOF
|
|
#undef PRINT_PAYLOAD_SIZEOF
|
|
}
|
|
};
|
|
|
|
} // namespace dart
|
|
|
|
int main(int argc, char* argv[]) {
|
|
std::cout << "#if " << ARCH_DEF << std::endl;
|
|
#if !defined(TARGET_ARCH_IA32) || !defined(DART_PRECOMPILED_RUNTIME)
|
|
dart::OffsetsExtractor::DumpOffsets();
|
|
#endif
|
|
std::cout << "#endif // " << ARCH_DEF << std::endl;
|
|
return 0;
|
|
}
|