You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
84 lines
2.4 KiB
84 lines
2.4 KiB
//===- 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 <cstdlib>
|
|
#include <stdint.h>
|
|
|
|
#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;
|
|
}
|