tests and fixes
This commit is contained in:
		
							parent
							
								
									4dc291b27e
								
							
						
					
					
						commit
						d1d1c88934
					
				
					 2 changed files with 18 additions and 11 deletions
				
			
		
							
								
								
									
										11
									
								
								boot.c
									
										
									
									
									
								
							
							
						
						
									
										11
									
								
								boot.c
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -1033,7 +1033,7 @@ int asm_sub(int lhs, int rhs) {
 | 
			
		|||
            exit(1);
 | 
			
		||||
        }
 | 
			
		||||
        int diff = asm_rr(TYPE_INT, "sub", lhs, rhs);
 | 
			
		||||
        _asm_ri("slli", diff, diff, log_step_of(lhs_type));
 | 
			
		||||
        _asm_ri("srai", diff, diff, log_step_of(lhs_type));
 | 
			
		||||
        return diff;
 | 
			
		||||
    }
 | 
			
		||||
    if (type1) {
 | 
			
		||||
| 
						 | 
				
			
			@ -1818,7 +1818,7 @@ void parse_global_variable(int id, const char* name, int type) {
 | 
			
		|||
    printf("%s:\n", name);
 | 
			
		||||
    if (token_type == TOKEN_ASSIGN) {
 | 
			
		||||
        expect_token(TOKEN_NUMBER);
 | 
			
		||||
        printf("  .word %d\n", token_data);
 | 
			
		||||
        printf("  .dword %d\n", token_data);
 | 
			
		||||
    } else if (token_type == TOKEN_BRACKET_LEFT) {
 | 
			
		||||
        if (type & TYPE_PTR_MASK) {
 | 
			
		||||
            eprintf("array of pointers is not supported\n");
 | 
			
		||||
| 
						 | 
				
			
			@ -1827,14 +1827,11 @@ void parse_global_variable(int id, const char* name, int type) {
 | 
			
		|||
        expect_token(TOKEN_NUMBER);
 | 
			
		||||
        int size = token_data;
 | 
			
		||||
        expect_token(TOKEN_BRACKET_RIGHT);
 | 
			
		||||
        int array_size = 4 * size;
 | 
			
		||||
        if (type == TYPE_CHAR) {
 | 
			
		||||
            array_size = size;
 | 
			
		||||
        }
 | 
			
		||||
        int array_size = type == TYPE_CHAR ? size : 4 * size;
 | 
			
		||||
        printf("  .zero %d\n", array_size);
 | 
			
		||||
        declare_global(id, MARKER_ARRAY, type);
 | 
			
		||||
    } else {
 | 
			
		||||
        printf("  .zero %d\n", 4);
 | 
			
		||||
        printf("  .zero %d\n", 8);
 | 
			
		||||
        unget_token();
 | 
			
		||||
    }
 | 
			
		||||
    expect_token(TOKEN_SEMICOLON);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										18
									
								
								demo/add.c
									
										
									
									
									
								
							
							
						
						
									
										18
									
								
								demo/add.c
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -1,11 +1,18 @@
 | 
			
		|||
int printf(const char format[], ...);
 | 
			
		||||
int scanf(const char format[], ...);
 | 
			
		||||
int putchar(int ch);
 | 
			
		||||
 | 
			
		||||
int* p;
 | 
			
		||||
void should_be(int expected, int actual) {
 | 
			
		||||
    if (expected != actual) {
 | 
			
		||||
        printf("Expected %d, but got %d\n", expected, actual);
 | 
			
		||||
    } else {
 | 
			
		||||
        printf("Passed\n");
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int* p = 0;
 | 
			
		||||
int f1() {
 | 
			
		||||
    int a = 1;
 | 
			
		||||
    return *(a+(a+(a+(a+(a+(a+(a+(a+(a+(a+(p))))))))))); // a[10]
 | 
			
		||||
    return *(a+(a+(a+(a+(a+(a+(a+(a+(a+(a+(p))))))))))); // p[10]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -13,5 +20,8 @@ int main() {
 | 
			
		|||
    int a[15];
 | 
			
		||||
    p = a;
 | 
			
		||||
    for (int i = 0; i < 15; a[i] = i, ++i);
 | 
			
		||||
    return f1();
 | 
			
		||||
    p -= 5;
 | 
			
		||||
    should_be(5, f1());
 | 
			
		||||
    should_be(5, a - p);
 | 
			
		||||
    should_be(10, 5);
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue