// 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 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;
}
