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