Index: crosstest/test_global.cpp |
diff --git a/crosstest/test_global.cpp b/crosstest/test_global.cpp |
index a670ff222528ea402055bac951735e74f0939b63..08a213efeed0714f76cbf88c4808931095f989a3 100644 |
--- a/crosstest/test_global.cpp |
+++ b/crosstest/test_global.cpp |
@@ -16,63 +16,75 @@ |
#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 }; |
+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 }; |
#if 0 |
+// TODO(kschimpf) Add this example once we know how to not mangle |
+// uninitialized, external globals (so that we can compare that |
+// the same, unmangled relocations are used). See comment in |
+// TargetGlobalInitX8632::lower in IceTargetLoweringX8632.cpp for |
+// details. |
+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, |
+}; |
+#endif |
+ |
#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), |
+ 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); |
-#endif // 0 |
-size_t getNumArrays() { |
- return 4; |
- // return NumArraysElements; |
-} |
+size_t getNumArrays() { return NumArraysElements; } |
const uint8_t *getArray(size_t WhichArray, size_t &Len) { |
- // Using a switch statement instead of a table lookup because such a |
- // table is represented as a kind of initializer that Subzero |
- // doesn't yet support. Specifically, the table becomes constant |
- // aggregate data, and it contains relocations. TODO(stichnot): |
- // switch over to the cleaner table-based method when global |
- // initializers are fully implemented. |
- switch (WhichArray) { |
- default: |
- Len = -1; |
- return NULL; |
- case 0: |
- Len = sizeof(ArrayInitPartial); |
- return (uint8_t *)&ArrayInitPartial; |
- case 1: |
- Len = sizeof(ArrayInitFull); |
- return (uint8_t *)&ArrayInitFull; |
- case 2: |
- Len = sizeof(ArrayConst); |
- return (uint8_t *)&ArrayConst; |
- case 3: |
- Len = sizeof(ArrayDouble); |
- return (uint8_t *)&ArrayDouble; |
- } |
-#if 0 |
if (WhichArray >= NumArraysElements) { |
Len = -1; |
return NULL; |
} |
Len = Arrays[WhichArray].ArraySizeInBytes; |
return Arrays[WhichArray].ArrayAddress; |
-#endif // 0 |
} |