Merge change 20021

* changes:
  Support 2D arrays.
This commit is contained in:
Android (Google) Code Review 2009-08-04 15:40:20 -07:00
commit c98c2b8970
3 changed files with 57 additions and 4 deletions

View File

@ -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) {

View File

@ -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;
}

View File

@ -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
""","""""")