Fix casts from 32bit integer types to 64bit integer types.
This bug was reported in http://lists.gnu.org/archive/html/tinycc-devel/2010-08/msg00050.html In this case, we should not emit any code when we cast from VT_FUNC to VT_PTR.
This commit is contained in:
		
							parent
							
								
									9d347f8742
								
							
						
					
					
						commit
						c31dc7aa0c
					
				
					 2 changed files with 15 additions and 5 deletions
				
			
		
							
								
								
									
										12
									
								
								tccgen.c
									
										
									
									
									
								
							
							
						
						
									
										12
									
								
								tccgen.c
									
										
									
									
									
								
							| 
						 | 
					@ -1883,12 +1883,14 @@ static void gen_cast(CType *type)
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
            } else if ((dbt & VT_BTYPE) == VT_LLONG ||
 | 
					            } else if ((dbt & VT_BTYPE) == VT_LLONG ||
 | 
				
			||||||
                       (dbt & VT_BTYPE) == VT_PTR) {
 | 
					                       (dbt & VT_BTYPE) == VT_PTR ||
 | 
				
			||||||
                /* XXX: not sure if this is perfect... need more tests */
 | 
					                       (dbt & VT_BTYPE) == VT_FUNC) {
 | 
				
			||||||
                if ((sbt & VT_BTYPE) != VT_LLONG) {
 | 
					                if ((sbt & VT_BTYPE) != VT_LLONG &&
 | 
				
			||||||
 | 
					                    (sbt & VT_BTYPE) != VT_PTR &&
 | 
				
			||||||
 | 
					                    (sbt & VT_BTYPE) != VT_FUNC) {
 | 
				
			||||||
 | 
					                    /* need to convert from 32bit to 64bit */
 | 
				
			||||||
                    int r = gv(RC_INT);
 | 
					                    int r = gv(RC_INT);
 | 
				
			||||||
                    if (sbt != (VT_INT | VT_UNSIGNED) &&
 | 
					                    if (sbt != (VT_INT | VT_UNSIGNED)) {
 | 
				
			||||||
                        sbt != VT_PTR && sbt != VT_FUNC) {
 | 
					 | 
				
			||||||
                        /* x86_64 specific: movslq */
 | 
					                        /* x86_64 specific: movslq */
 | 
				
			||||||
                        o(0x6348);
 | 
					                        o(0x6348);
 | 
				
			||||||
                        o(0xc0 + (REG_VALUE(r) << 3) + REG_VALUE(r));
 | 
					                        o(0xc0 + (REG_VALUE(r) << 3) + REG_VALUE(r));
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1094,6 +1094,14 @@ void struct_assign_test(void)
 | 
				
			||||||
    printf("before call: %d %d\n", lsta2.f1, lsta2.f2);
 | 
					    printf("before call: %d %d\n", lsta2.f1, lsta2.f2);
 | 
				
			||||||
    lsta2 = struct_assign_test2(lsta2, 4);
 | 
					    lsta2 = struct_assign_test2(lsta2, 4);
 | 
				
			||||||
    printf("after call: %d %d\n", lsta2.f1, lsta2.f2);
 | 
					    printf("after call: %d %d\n", lsta2.f1, lsta2.f2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    static struct {
 | 
				
			||||||
 | 
					        void (*elem)();
 | 
				
			||||||
 | 
					    } t[] = {
 | 
				
			||||||
 | 
					        /* XXX: we should allow this even without braces */
 | 
				
			||||||
 | 
					        { struct_assign_test }
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
 | 
					    printf("%d\n", struct_assign_test == t[0].elem);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* casts to short/char */
 | 
					/* casts to short/char */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		
		Reference in a new issue