-
Notifications
You must be signed in to change notification settings - Fork 130
Stablize variable typing and support integer truncation and sign extension #201
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Conversation
Regards to the issue of sign extension on rv32 backend, should we introduce a compiler parameter |
It is a good idea. However, we then need to an effective way to select the extensions for RISC-V backend. |
@@ -167,6 +223,73 @@ opcode_t get_operator() | |||
return op; | |||
} | |||
|
|||
var_t *promote_unchecked(block_t *block, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think the name of this function is a bit too long. How about renaming this function to __promote()
?
i.e., __promote()
would directly promote the variable, while promote()
checks some conditions and calls __promote()
if promotion is necessary.
(This suggestion is minor.)
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Shorten naming is good in my opinion, but my thought on __
prefix is that functions using this naming should be some kind of private functions that should not be used directly (see lib/c.c
)?
Fyi _unchecked
suffix is inspired by Rust's naming, e.g. pointer#get_unchecked
.
return promote_unchecked(block, bb, var, target_type, target_ptr); | ||
} | ||
|
||
var_t *truncate_unchecked(block_t *block, |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Similarly, how about renaming this function to __truncate()
to shorten the name?
(Also, this suggestion is minor.)
params[param_num++] = opstack_pop(); | ||
param = opstack_pop(); | ||
|
||
if (func) { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It seems that func
may be NULL
if encountering an indirect call. How about writing some comments to explain the situation if func
is NULL
?
This is a attempt to support variable typing for all local variables (including synthesized ones) so that integer truncation and sign extension could be implemented, which targets to fix #166.
Notice that there's still some works including type derivation from operators and code cleanup.
About sign extension in rv32
It seems that package
qemu-user
is currently outdated (6.2.0) so Zbb extension is not supported, which results in the implementation of sign extension in rv32 currently using straightforward way to implement, that is bitwise shifting.Summary by Bito
This pull request significantly enhances the variable typing system by introducing support for integer truncation and sign extension, optimizing memory allocation for local variables, and improving parameter type printing. It also enhances error handling by replacing the error_no_loc function with a new fatal function, improving error message clarity and addressing existing variable handling issues. These changes lay the groundwork for future enhancements in type derivation and memory management.Unit tests added: True
Estimated effort to review (1-5, lower is better): 2