// Copyright 2015 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include <stdlib.h>

#include "src/assembler-inl.h"
#include "src/objects-inl.h"
#include "src/v8.h"
#include "test/cctest/cctest.h"
#include "test/cctest/compiler/c-signature.h"
#include "test/cctest/wasm/wasm-run-utils.h"
#include "test/common/wasm/wasm-macro-gen.h"

namespace v8 {
namespace internal {
namespace wasm {
namespace test_run_wasm_relocation {

#define FOREACH_TYPE(TEST_BODY)    \
  TEST_BODY(int32_t, WASM_I32_ADD) \
  TEST_BODY(int64_t, WASM_I64_ADD) \
  TEST_BODY(float, WASM_F32_ADD)   \
  TEST_BODY(double, WASM_F64_ADD)

#define LOAD_SET_GLOBAL_TEST_BODY(C_TYPE, ADD)                                 \
  WASM_EXEC_TEST(WasmRelocateGlobal_##C_TYPE) {                                \
    WasmRunner<C_TYPE, C_TYPE> r(execution_mode);                              \
    Isolate* isolate = CcTest::i_isolate();                                    \
                                                                               \
    r.builder().AddGlobal<C_TYPE>();                                           \
    r.builder().AddGlobal<C_TYPE>();                                           \
                                                                               \
    /* global = global + p0 */                                                 \
    BUILD(r, WASM_SET_GLOBAL(1, ADD(WASM_GET_GLOBAL(0), WASM_GET_LOCAL(0))),   \
          WASM_GET_GLOBAL(0));                                                 \
    CHECK_EQ(1, r.builder().CodeTableLength());                                \
                                                                               \
    int filter = 1 << RelocInfo::WASM_GLOBAL_REFERENCE;                        \
                                                                               \
    Handle<Code> code = r.builder().GetFunctionCode(0);                        \
                                                                               \
    Address old_start = r.builder().globals_start();                           \
    Address new_start = old_start + 1;                                         \
                                                                               \
    Address old_addresses[4];                                                  \
    uint32_t address_index = 0U;                                               \
    for (RelocIterator it(*code, filter); !it.done(); it.next()) {             \
      old_addresses[address_index] = it.rinfo()->wasm_global_reference();      \
      it.rinfo()->update_wasm_global_reference(isolate, old_start, new_start); \
      ++address_index;                                                         \
    }                                                                          \
    CHECK_LE(address_index, 4U);                                               \
                                                                               \
    address_index = 0U;                                                        \
    for (RelocIterator it(*code, filter); !it.done(); it.next()) {             \
      CHECK_EQ(old_addresses[address_index] + 1,                               \
               it.rinfo()->wasm_global_reference());                           \
      ++address_index;                                                         \
    }                                                                          \
    CHECK_LE(address_index, 4U);                                               \
  }

FOREACH_TYPE(LOAD_SET_GLOBAL_TEST_BODY)

#undef FOREACH_TYPE
#undef LOAD_SET_GLOBAL_TEST_BODY

}  // namespace test_run_wasm_relocation
}  // namespace wasm
}  // namespace internal
}  // namespace v8
