Skip to content
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

Add hot reload flag #7

Open
wants to merge 44 commits into
base: master
Choose a base branch
from
Open

Add hot reload flag #7

wants to merge 44 commits into from

Conversation

CohenArthur
Copy link
Member

Add the --online-change option to enable mangling of functions, as well as globals once that bit is merged upstream. I'm guessing we might want to integrate this with the got-layout-file option you're adding in #6 but we can think about this later on

Comment on lines 287 to 296
compile_options.online_change,
)?;
code_generator.generate(context, unit, &self.annotations, &self.index, &llvm_index)
code_generator.generate(
context,
unit,
&self.annotations,
&self.index,
&llvm_index,
compile_options.online_change,
)
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not a fan of duplicating the parameter here, but they do the same for self.index and it would require the introduction of one more "context-like" type to code_generator. Do you think it's worth it?

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hmm, I do feel like it might fit better as a parameter in the constructor, but I can't articulate precisely why! Online change does feel like a piece of information relevant to codegen at the same granularity as the optimization level or the debug level.

@lewis-revill
Copy link

This looks good to me, my suggestion for how we deal with the --got-layout-file argument in conjunction with this is to have a default generated filename based on the output executable name when --online-change is provided, and just use --got-layout-file to be able to override that if needed. And if it's provided when --online-change is not provided, just error.

@CohenArthur CohenArthur force-pushed the add-hot-reload-flag branch from b38dcda to 03aa862 Compare June 11, 2024 14:13
@lewis-revill
Copy link

Current state looks good to me!

ghaith and others added 2 commits June 12, 2024 08:27
* refactor(AST): introduce AstVisitor trait

The AST-Visitor trait allows generic visiting of AST-nodes. A default
Walking behavior is implemented for each AstStatement but it can be
altered by any implementor. When overriding a visit_XXX method, the
implementation can decide to continue with the default walking behavior
(by calling the walk function on the passed AstStatement-Struct, to skip it,
or to continue with an alternative walking bahavior.

removed unused AST element CastStatement
@CohenArthur CohenArthur force-pushed the add-hot-reload-flag branch from 03aa862 to dd98502 Compare June 12, 2024 13:54
ghaith and others added 19 commits June 14, 2024 06:36
This PR introduces llvm-lit, which at some point will replace our current correctness tests. For now only the functionality was introduced as well as GitHub workflows executing example lit tests.
…LC-lang#1248)

* fix: for loop condition

This PR fixes for loops executing once when the predicate already should not be met for decrementing loops.
I have also re-implemented the codegen logic for for-loops, resulting in fewer predecessors and hopefully more
readable IR.

Resolves PLC-lang#1207
* add ast cli argument to print the AST to stdout

* use pretty printed format

Co-authored-by: Volkan <[email protected]>

---------

Co-authored-by: Volkan <[email protected]>
This PR introduces two new keywords, namely `REF=` and `REFERENCE TO`:
* `REF=` is essentially syntactic sugar for an assignment where the right-hand side is wrapped in a `REF()` function call. Therefore `foo := REF(bar)` and `foo REF= bar` are equivalent.
* `REFERENCE TO` is identical to `REF_TO` with the exception of being auto-deref by default. A variable `foo` declared as `REFERENCE TO` will therefore auto-deref on assignments, i.e. `foo := 5` is equivalent to `foo^ := 5`.

More information on CodeSys' [REF=](https://help.codesys.com/api-content/2/codesys/3.5.12.0/en/_cds_ref_assignment/) and [REFERENCE TO](https://help.codesys.com/api-content/2/codesys/3.5.12.0/en/_cds_datatype_reference/) documentation pages.
Prints any log calls in VSCodes debug console
Bumps [openssl](https://github.com/sfackler/rust-openssl) from 0.10.64 to 0.10.66.
- [Release notes](https://github.com/sfackler/rust-openssl/releases)
- [Commits](sfackler/rust-openssl@openssl-v0.10.64...openssl-v0.10.66)

---
updated-dependencies:
- dependency-name: openssl
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
This commit introduces aliasing, where the `AT` keyword can be used on a reference declaration to create a `REFERENCE TO` pointer. Specifically `foo AT bar : DINT` internally resolves to `foo : REFERENCE TO DINT := REF(bar)`.
Fixes an issue where omitting a data-type in an alias variable would cause a panic in the parser. For example

```
FUNCTION main
    VAR
        s AT str; // omitted data-type
    END_VAR
END_FUNCTION
```
This commit contains changes that are required to generate a global
variable which will be used to store an array of addresses of other
global variables in the program. The location of the globals within this
array should be stable after a recompilation to support online change,
so we support loading a pre-existing layout to ensure that for all
globals that we see in both the current program and the pre-existing
layout, their positions remain the same. Otherwise, any new globals will
be placed in any empty spaces left by old globals, or appended on to the
end of the array. The layout will then be saved back the the file used
for saving and loading.

Currently, to use this feature the flag `--got-layout-file=<file>` must
be provided, which should specify the name of either a TOML or JSON file
to use to save, and optionally load if the file already exists, the GOT
layout. In future we will integrate this with a generic online change
flag, whereby it will not be necessary to ask for a GOT layout file when
we already know that we need it for online change.
This commit introduces the association of GOT indices to the LLVM index,
which then allows us to utilise that when generating references to
variables to check if a given variable has an entry in the GOT. If so,
we obtain its index, and generate the necessary LLVM IR to access the
address contained within the GOT rather than accessing the variable
directly.
This change involves moving the generation of the GOT from
variable_generator.rs to codegen.rs, in order to also cover not only
global variables but also functions and 'programs' too. Once these have
been given an associated index in the GOT we can use that to replace
normal direct function calls with indirect calls to a function pointer
stored in the GOT. We don't do this for calls with external linkage
since these won't be subject to online change.
This commit also adds workarounds to make the integration of the generated
code with our online change runtime work well.

wip: almost done with Mutex hashmap

NOTE: Reuse got_indices member from LlvmIndex instead

wip: it works?

src/test_utils: wip: Make these function compile after latest changes

section_mangler: Fix emitted format

wip

codegen custom GOT as a non-external array

wip: running onlinechangexmpl almost works! crashes on signal1()

more hacks

cleanup

cleanup
@CohenArthur CohenArthur force-pushed the add-hot-reload-flag branch from dd98502 to f18a4aa Compare July 30, 2024 15:25
@CohenArthur CohenArthur force-pushed the add-hot-reload-flag branch from f18a4aa to d4adaee Compare July 30, 2024 15:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

7 participants