//===- subzero/crosstest/test_global.cpp - Global variable access tests ---===//
//
//                        The Subzero Code Generator
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// Implementation for crosstesting global variable access operations.
//
//===----------------------------------------------------------------------===//

#include <stdint.h>
#include <cstdlib>

#include "test_global.h"

// Note: The following take advantage of the fact that external global
// names are not mangled with the --prefix CL argument. Hence, they
// should have the same relocation value for both llc and Subzero.
extern uint8_t *ExternName1;
extern uint8_t *ExternName2;
extern uint8_t *ExternName3;
extern uint8_t *ExternName4;
extern uint8_t *ExternName5;

// Partially initialized array
int ArrayInitPartial[10] = {60, 70, 80, 90, 100};
int ArrayInitFull[] = {10, 20, 30, 40, 50};
const int ArrayConst[] = {-10, -20, -30};
static double ArrayDouble[10] = { 0.5, 1.5, 2.5, 3.5 };

static struct {
  int Array1[5];
  uint8_t *Pointer1;
  double Array2[3];
  uint8_t *Pointer2;
  struct {
    uint8_t *Pointer3;
    int Array1[3];
    uint8_t *Pointer4;
  } NestedStuff;
  uint8_t *Pointer5;
} StructEx = {
  { 10, 20, 30, 40, 50 },
  ExternName1,
  { 0.5, 1.5, 2.5 },
  ExternName4,
  { ExternName3, {1000, 1010, 1020}, ExternName2 },
  ExternName5,
};

#define ARRAY(a)                                                               \
  { (uint8_t *)(a), sizeof(a) }

// Note: By embedding the array addresses in this table, we are indirectly
// testing relocations (i.e. getArray would return the wrong address if
// relocations are broken).
struct {
  uint8_t *ArrayAddress;
  size_t ArraySizeInBytes;
} Arrays[] = {
      ARRAY(ArrayInitPartial),
      ARRAY(ArrayInitFull),
      ARRAY(ArrayConst),
      ARRAY(ArrayDouble),
      {(uint8_t *)(ArrayInitPartial + 2),
       sizeof(ArrayInitPartial) - 2 * sizeof(int)},
      { (uint8_t*)(&StructEx), sizeof(StructEx) },
};
size_t NumArraysElements = sizeof(Arrays) / sizeof(*Arrays);

size_t getNumArrays() { return NumArraysElements; }

const uint8_t *getArray(size_t WhichArray, size_t &Len) {
  if (WhichArray >= NumArraysElements) {
    Len = -1;
    return NULL;
  }
  Len = Arrays[WhichArray].ArraySizeInBytes;
  return Arrays[WhichArray].ArrayAddress;
}
