fix dereferencing function pointer codegen

This commit is contained in:
pommicket 2022-02-13 09:33:05 -05:00
parent 8c82a83778
commit 07faf56f7d
3 changed files with 18 additions and 7 deletions

View file

@ -1457,6 +1457,8 @@ function generate_push_expression
if c == EXPRESSION_CONSTANT_INT goto generate_int if c == EXPRESSION_CONSTANT_INT goto generate_int
if c == EXPRESSION_CONSTANT_FLOAT goto generate_float if c == EXPRESSION_CONSTANT_FLOAT goto generate_float
if c == EXPRESSION_GLOBAL_VARIABLE goto generate_global_variable
if c == EXPRESSION_LOCAL_VARIABLE goto generate_local_variable
if c == EXPRESSION_FUNCTION goto generate_function_addr if c == EXPRESSION_FUNCTION goto generate_function_addr
if c == EXPRESSION_CAST goto generate_cast if c == EXPRESSION_CAST goto generate_cast
if c == EXPRESSION_UNARY_PLUS goto generate_cast ; the unary plus operator just casts to the promoted type if c == EXPRESSION_UNARY_PLUS goto generate_cast ; the unary plus operator just casts to the promoted type
@ -1473,15 +1475,13 @@ function generate_push_expression
if c == EXPRESSION_BITWISE_XOR goto generate_bitwise_xor if c == EXPRESSION_BITWISE_XOR goto generate_bitwise_xor
if c == EXPRESSION_LSHIFT goto generate_lshift if c == EXPRESSION_LSHIFT goto generate_lshift
if c == EXPRESSION_RSHIFT goto generate_rshift if c == EXPRESSION_RSHIFT goto generate_rshift
if c == EXPRESSION_GLOBAL_VARIABLE goto generate_global_variable if c == EXPRESSION_ASSIGN goto generate_assign
if c == EXPRESSION_LOCAL_VARIABLE goto generate_local_variable
if c == EXPRESSION_DEREFERENCE goto generate_dereference if c == EXPRESSION_DEREFERENCE goto generate_dereference
if c == EXPRESSION_SUBSCRIPT goto generate_subscript if c == EXPRESSION_SUBSCRIPT goto generate_subscript
if c == EXPRESSION_ADDRESS_OF goto generate_address_of if c == EXPRESSION_ADDRESS_OF goto generate_address_of
if c == EXPRESSION_DOT goto generate_dot_or_arrow if c == EXPRESSION_DOT goto generate_dot_or_arrow
if c == EXPRESSION_ARROW goto generate_dot_or_arrow if c == EXPRESSION_ARROW goto generate_dot_or_arrow
if c == EXPRESSION_COMMA goto generate_comma if c == EXPRESSION_COMMA goto generate_comma
if c == EXPRESSION_ASSIGN goto generate_assign
if c == EXPRESSION_CALL goto generate_call if c == EXPRESSION_CALL goto generate_call
if c == EXPRESSION_LOGICAL_AND goto generate_logical_and if c == EXPRESSION_LOGICAL_AND goto generate_logical_and
if c == EXPRESSION_LOGICAL_OR goto generate_logical_or if c == EXPRESSION_LOGICAL_OR goto generate_logical_or
@ -1765,8 +1765,12 @@ function generate_push_expression
return expr return expr
:generate_dereference :generate_dereference
expr += 8 expr += 8
p = expr + 4
expr = generate_push_expression(statement, expr) expr = generate_push_expression(statement, expr)
p = types + *4p
if *2p == TYPE2_FUNCTION_POINTER goto deref_function_pointer
generate_stack_dereference(statement, type) generate_stack_dereference(statement, type)
:deref_function_pointer ; dereferencing a function pointer does NOTHING
return expr return expr
:generate_subscript :generate_subscript
expr += 8 expr += 8

View file

@ -12,7 +12,7 @@ long fibonacci(long x) {
} }
int main(int argc, char **argv) { int main(int argc, char **argv) {
double x = 3.5; long (*fp)(long) = factorial;
return factorial(x); return (*fp)(6);
} }

View file

@ -32,6 +32,13 @@ function type_is_array
if *1p == TYPE_ARRAY goto return_1 if *1p == TYPE_ARRAY goto return_1
return 0 return 0
function type_is_function
argument type
local p
p = types + type
if *1p == TYPE_FUNCTION goto return_1
return 0
function functype_return_type function functype_return_type
argument ftype argument ftype
local type local type
@ -3190,7 +3197,7 @@ function parse_expression
if c == 0 goto undeclared_variable if c == 0 goto undeclared_variable
*1out = EXPRESSION_FUNCTION *1out = EXPRESSION_FUNCTION
out += 4 out += 4
*4out = c *4out = type_create_pointer(c)
out += 4 out += 4
*8out = a *8out = a
out += 8 out += 8
@ -3360,7 +3367,7 @@ function type_sizeof
; - code generation reasons ; - code generation reasons
if c == TYPE_VOID goto return_1 if c == TYPE_VOID goto return_1
if c == TYPE_POINTER goto return_8 if c == TYPE_POINTER goto return_8
if c == TYPE_FUNCTION goto return_8 if c == TYPE_FUNCTION goto return_1
if c == TYPE_ARRAY goto sizeof_array if c == TYPE_ARRAY goto sizeof_array
if c == TYPE_STRUCT goto sizeof_struct if c == TYPE_STRUCT goto sizeof_struct