diff options
author | Jack Palevich <jackpal@google.com> | 2009-08-04 15:39:49 -0700 |
---|---|---|
committer | Jack Palevich <jackpal@google.com> | 2009-08-04 15:39:49 -0700 |
commit | 80e4972625b60d799db67021af18194567aed3e7 (patch) | |
tree | 43ae52a46d096c2050643d9b5ef52ad66d658acc /libacc | |
parent | b61545096d2f55f76b22b7ef734e7cdb0c5eaf97 (diff) | |
download | system_core-80e4972625b60d799db67021af18194567aed3e7.zip system_core-80e4972625b60d799db67021af18194567aed3e7.tar.gz system_core-80e4972625b60d799db67021af18194567aed3e7.tar.bz2 |
Support 2D arrays.
Diffstat (limited to 'libacc')
-rw-r--r-- | libacc/acc.cpp | 19 | ||||
-rw-r--r-- | libacc/tests/data/array.c | 30 | ||||
-rw-r--r-- | libacc/tests/test.py | 12 |
3 files changed, 57 insertions, 4 deletions
diff --git a/libacc/acc.cpp b/libacc/acc.cpp index 0a16489..b06ad53 100644 --- a/libacc/acc.cpp +++ b/libacc/acc.cpp @@ -1168,7 +1168,8 @@ class Compiler : public ErrorSink { virtual void loadR0FromR0() { Type* pPointerType = getR0Type(); assert(pPointerType->tag == TY_POINTER); - TypeTag tag = pPointerType->pHead->tag; + Type* pNewType = pPointerType->pHead; + TypeTag tag = pNewType->tag; switch (tag) { case TY_POINTER: case TY_INT: @@ -1184,11 +1185,14 @@ class Compiler : public ErrorSink { case TY_DOUBLE: o4(0xE1C000D0); // ldrd r0, [r0] break; + case TY_ARRAY: + pNewType = pNewType->pTail; + break; default: error("loadR0FromR0: unimplemented type %d", tag); break; } - setR0Type(pPointerType->pHead); + setR0Type(pNewType); } virtual void leaR0(int ea, Type* pPointerType, ExpressionType et) { @@ -2213,7 +2217,8 @@ class Compiler : public ErrorSink { virtual void loadR0FromR0() { Type* pPointerType = getR0Type(); assert(pPointerType->tag == TY_POINTER); - TypeTag tag = pPointerType->pHead->tag; + Type* pNewType = pPointerType->pHead; + TypeTag tag = pNewType->tag; switch (tag) { case TY_POINTER: case TY_INT: @@ -2233,11 +2238,14 @@ class Compiler : public ErrorSink { case TY_DOUBLE: o2(0x00dd); // fldl (%eax) break; + case TY_ARRAY: + pNewType = pNewType->pTail; + break; default: error("loadR0FromR0: unsupported type %d", tag); break; } - setR0Type(pPointerType->pHead); + setR0Type(pNewType); } virtual void leaR0(int ea, Type* pPointerType, ExpressionType et) { @@ -4126,6 +4134,9 @@ class Compiler : public ErrorSink { pTargetType = pGen->getR0Type(); if (pTargetType->tag == TY_FLOAT) { pTargetType = mkpDouble; + } else if (pTargetType->tag == TY_ARRAY) { + // Pass arrays by pointer. + pTargetType = pTargetType->pTail; } } if (pTargetType->tag == TY_VOID) { diff --git a/libacc/tests/data/array.c b/libacc/tests/data/array.c index 3af5e31..ca4a728 100644 --- a/libacc/tests/data/array.c +++ b/libacc/tests/data/array.c @@ -66,6 +66,34 @@ void testArgs() { printf("\n"); } +void testDecay() { + char c[4]; + c[0] = 'H'; + c[1] = 'i'; + c[2] = '!'; + c[3] = 0; + printf("testDecay: %s\n", c); +} + +void test2D() { + char c[10][20]; + int x; + int y; + printf("test2D:\n"); + for(y = 0; y < 10; y++) { + for(x = 0; x < 20; x++) { + c[y][x] = 'a' + (15 & (y * 19 + x)); + } + } + for(y = 0; y < 10; y++) { + for(x = 0; x < 20; x++) { + printf("%c", c[y][x]); + } + printf("\n"); + } + +} + int main() { testLocalInt(); @@ -73,5 +101,7 @@ int main() testGlobalChar(); testGlobalDouble(); testArgs(); + testDecay(); + test2D(); return 0; } diff --git a/libacc/tests/test.py b/libacc/tests/test.py index 4ad2e13..9691c27 100644 --- a/libacc/tests/test.py +++ b/libacc/tests/test.py @@ -394,6 +394,18 @@ localDouble: 3 3 globalChar: 3 globalDouble: 3 testArgs: 0 2 4 +testDecay: Hi! +test2D: +abcdefghijdefghijklm +defghijklmghijklmnop +ghijklmnopjklmnopabc +jklmnopabcmnopabcdef +mnopabcdefpabcdefghi +pabcdefghicdefghijkl +cdefghijklfghijklmno +fghijklmnoijklmnopab +ijklmnopablmnopabcde +lmnopabcdefghijklmno result: 0 ""","""""") |