1//===- subzero/crosstest/test_global.cpp - Global variable access tests ---===//
2//
3//                        The Subzero Code Generator
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// Implementation for crosstesting global variable access operations.
11//
12//===----------------------------------------------------------------------===//
13
14#include <stdint.h>
15#include <cstdlib>
16
17#include "test_global.h"
18
19// Note: The following take advantage of the fact that external global
20// names are not mangled with the --prefix CL argument. Hence, they
21// should have the same relocation value for both llc and Subzero.
22extern uint8_t *ExternName1;
23extern uint8_t *ExternName2;
24extern uint8_t *ExternName3;
25extern uint8_t *ExternName4;
26extern uint8_t *ExternName5;
27
28// Partially initialized array
29int ArrayInitPartial[10] = {60, 70, 80, 90, 100};
30int ArrayInitFull[] = {10, 20, 30, 40, 50};
31const int ArrayConst[] = {-10, -20, -30};
32static double ArrayDouble[10] = {0.5, 1.5, 2.5, 3.5};
33
34static struct {
35  int Array1[5];
36  uint8_t *Pointer1;
37  double Array2[3];
38  uint8_t *Pointer2;
39  struct {
40    uint8_t *Pointer3;
41    int Array1[3];
42    uint8_t *Pointer4;
43  } NestedStuff;
44  uint8_t *Pointer5;
45} StructEx = {
46    {10, 20, 30, 40, 50},
47    ExternName1,
48    {0.5, 1.5, 2.5},
49    ExternName4,
50    {ExternName3, {1000, 1010, 1020}, ExternName2},
51    ExternName5,
52};
53
54#define ARRAY(a)                                                               \
55  { (uint8_t *)(a), sizeof(a) }
56
57// Note: By embedding the array addresses in this table, we are indirectly
58// testing relocations (i.e. getArray would return the wrong address if
59// relocations are broken).
60struct {
61  uint8_t *ArrayAddress;
62  size_t ArraySizeInBytes;
63} Arrays[] = {
64    ARRAY(ArrayInitPartial),
65    ARRAY(ArrayInitFull),
66    ARRAY(ArrayConst),
67    ARRAY(ArrayDouble),
68    {(uint8_t *)(ArrayInitPartial + 2),
69     sizeof(ArrayInitPartial) - 2 * sizeof(int)},
70    {(uint8_t *)(&StructEx), sizeof(StructEx)},
71};
72size_t NumArraysElements = sizeof(Arrays) / sizeof(*Arrays);
73
74size_t getNumArrays() { return NumArraysElements; }
75
76const uint8_t *getArray(size_t WhichArray, size_t &Len) {
77  if (WhichArray >= NumArraysElements) {
78    Len = -1;
79    return NULL;
80  }
81  Len = Arrays[WhichArray].ArraySizeInBytes;
82  return Arrays[WhichArray].ArrayAddress;
83}
84