blob: 7b5d4c1fcdb4b4bce32ac8b976b522341995b868 [file] [log] [blame]
Jim Stichnoth7da431b2014-08-05 11:22:37 -07001//===- 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
Jim Stichnothde4ca712014-06-29 08:13:48 -070014#include <cstdlib>
Antonio Maioranoca8a16e2020-11-10 16:56:20 -050015#include <stdint.h>
Jim Stichnothde4ca712014-06-29 08:13:48 -070016
17#include "test_global.h"
18
Karl Schimpfe3f64d02014-10-07 10:38:22 -070019// 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
Jim Stichnothde4ca712014-06-29 08:13:48 -070028// Partially initialized array
Karl Schimpfe3f64d02014-10-07 10:38:22 -070029int ArrayInitPartial[10] = {60, 70, 80, 90, 100};
30int ArrayInitFull[] = {10, 20, 30, 40, 50};
31const int ArrayConst[] = {-10, -20, -30};
Jim Stichnothdd842db2015-01-27 12:53:53 -080032static double ArrayDouble[10] = {0.5, 1.5, 2.5, 3.5};
Jim Stichnothde4ca712014-06-29 08:13:48 -070033
Karl Schimpfe3f64d02014-10-07 10:38:22 -070034static 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 = {
Jim Stichnothd9dc82e2015-03-03 17:06:33 -080046 {10, 20, 30, 40, 50},
47 ExternName1,
48 {0.5, 1.5, 2.5},
49 ExternName4,
50 {ExternName3, {1000, 1010, 1020}, ExternName2},
51 ExternName5,
Karl Schimpfe3f64d02014-10-07 10:38:22 -070052};
Karl Schimpfe3f64d02014-10-07 10:38:22 -070053
Jim Stichnothde4ca712014-06-29 08:13:48 -070054#define ARRAY(a) \
55 { (uint8_t *)(a), sizeof(a) }
56
Karl Schimpfe3f64d02014-10-07 10:38:22 -070057// 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).
Jim Stichnothde4ca712014-06-29 08:13:48 -070060struct {
61 uint8_t *ArrayAddress;
62 size_t ArraySizeInBytes;
63} Arrays[] = {
Jim Stichnothd9dc82e2015-03-03 17:06:33 -080064 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)},
Jim Stichnothde4ca712014-06-29 08:13:48 -070071};
72size_t NumArraysElements = sizeof(Arrays) / sizeof(*Arrays);
Jim Stichnothde4ca712014-06-29 08:13:48 -070073
Karl Schimpfe3f64d02014-10-07 10:38:22 -070074size_t getNumArrays() { return NumArraysElements; }
Jim Stichnothde4ca712014-06-29 08:13:48 -070075
76const uint8_t *getArray(size_t WhichArray, size_t &Len) {
Jim Stichnothde4ca712014-06-29 08:13:48 -070077 if (WhichArray >= NumArraysElements) {
78 Len = -1;
79 return NULL;
80 }
81 Len = Arrays[WhichArray].ArraySizeInBytes;
82 return Arrays[WhichArray].ArrayAddress;
Jim Stichnothde4ca712014-06-29 08:13:48 -070083}