Merge change 7049

* changes:
  Implement support for "char" local and global variables.
diff --git a/libacc/acc.cpp b/libacc/acc.cpp
index fb7ec80..7f726f1 100644
--- a/libacc/acc.cpp
+++ b/libacc/acc.cpp
@@ -1019,6 +1019,25 @@
             LOG_API("storeR0(%d);\n", ea);
             TypeTag tag = pType->tag;
             switch (tag) {
+                case TY_CHAR:
+                    if (ea > -LOCAL && ea < LOCAL) {
+                        // Local, fp relative
+                        if (ea < -4095 || ea > 4095) {
+                            error("Offset out of range: %08x", ea);
+                        }
+                        if (ea < 0) {
+                            o4(0xE54B0000 | (0xfff & (-ea))); // strb r0, [fp,#-ea]
+                        } else {
+                            o4(0xE5CB0000 | (0xfff & ea)); // strb r0, [fp,#ea]
+                        }
+                    } else{
+                        // Global, absolute
+                        o4(0xE59F1000); //         ldr r1, .L1
+                        o4(0xEA000000); //         b .L99
+                        o4(ea);         // .L1:    .word 0
+                        o4(0xE5C10000); // .L99:   strb r0, [r1]
+                    }
+                    break;
                 case TY_POINTER:
                 case TY_INT:
                 case TY_FLOAT:
@@ -1079,8 +1098,32 @@
 
         virtual void loadR0(int ea, bool isIncDec, int op, Type* pType) {
             LOG_API("loadR0(%d, %d, %d, %d);\n", ea, isIncDec, op, pType);
-            TypeTag tag = collapseType(pType->tag);
+            TypeTag tag = pType->tag;
             switch (tag) {
+                case TY_CHAR:
+                    if (ea < LOCAL) {
+                        // Local, fp relative
+                        if (ea < -4095 || ea > 4095) {
+                            error("Offset out of range: %08x", ea);
+                        }
+                        if (ea < 0) {
+                            o4(0xE55B0000 | (0xfff & (-ea))); // ldrb r0, [fp,#-ea]
+                        } else {
+                            o4(0xE5DB0000 | (0xfff & ea));    // ldrb r0, [fp,#ea]
+                        }
+                    } else {
+                        // Global, absolute
+                        o4(0xE59F2000); //        ldr r2, .L1
+                        o4(0xEA000000); //        b .L99
+                        o4(ea);         // .L1:   .word ea
+                        o4(0xE5D20000); // .L99:  ldrb r0, [r2]
+                    }
+
+                    if (isIncDec) {
+                        error("inc/dec not implemented for char.");
+                    }
+                    break;
+                case TY_POINTER:
                 case TY_INT:
                 case TY_FLOAT:
                     if (ea < LOCAL) {
@@ -2027,6 +2070,13 @@
         virtual void storeR0(int ea, Type* pType) {
             TypeTag tag = pType->tag;
             switch (tag) {
+                case TY_CHAR:
+                    if (ea < -LOCAL || ea > LOCAL) {
+                        oad(0xa2, ea); // movb %al,ea
+                    } else {
+                        oad(0x8588, ea); // movb %al,ea(%ebp)
+                    }
+                    break;
                 case TY_INT:
                 case TY_POINTER:
                     gmov(6, ea); /* mov %eax, EA */
@@ -2052,10 +2102,24 @@
         }
 
         virtual void loadR0(int ea, bool isIncDec, int op, Type* pType) {
-            TypeTag tag = collapseType(pType->tag);
+            TypeTag tag = pType->tag;
             switch (tag) {
+                case TY_CHAR:
+                    if (ea < -LOCAL || ea > LOCAL) {
+                        oad(0x05BE0F, ea); // movsbl  ea,%eax
+                    } else {
+                        oad(0x85BE0F, ea); // movsbl  ea(%ebp),%eax
+                    }
+                    if (isIncDec) {
+                        error("inc/dec not implemented for char.");
+                    }
+                    break;
                 case TY_INT:
-                    gmov(8, ea); /* mov EA, %eax */
+                case TY_POINTER:
+                    if (tag == TY_CHAR) {
+                    } else {
+                        gmov(8, ea); /* mov EA, %eax */
+                    }
                     if (isIncDec) {
                         /* Implement post-increment or post decrement.
                          */
diff --git a/libacc/tests/data/char.c b/libacc/tests/data/char.c
new file mode 100644
index 0000000..8c63ba2
--- /dev/null
+++ b/libacc/tests/data/char.c
@@ -0,0 +1,13 @@
+char ga;
+char gb;
+
+int main() {
+    char a = 'c';
+    char b = a * 3;
+    printf("a = %d, b = %d\n", a, b);
+    ga = 'd';
+    gb = ga * 3;
+    printf("ga = %d, gb = %d\n", ga, gb);
+    return 0;
+}
+
diff --git a/libacc/tests/test.py b/libacc/tests/test.py
index 702f49d..02999f0 100644
--- a/libacc/tests/test.py
+++ b/libacc/tests/test.py
@@ -250,6 +250,12 @@
 Testing read/write (double*): 8.8 9.9
 """)
 
+    def testChar(self):
+        self.compileCheck(["-R", "data/char.c"], """Executing compiled code:
+result: 0""", """a = 99, b = 41
+ga = 100, gb = 44""")
+
+
 if __name__ == '__main__':
     if not outputCanRun():
         print "Many tests are expected to fail, because acc is not a 32-bit x86 Linux executable."