Commit 3afda43
committed
compiler: analyze type and value of global declaration separately
This commit separates semantic analysis of the annotated type vs value
of a global declaration, therefore allowing recursive and mutually
recursive values to be declared.
Every `Nav` which undergoes analysis now has *two* corresponding
`AnalUnit`s: `.{ .nav_val = n }` and `.{ .nav_ty = n }`. The `nav_val`
unit is responsible for *fully resolving* the `Nav`: determining its
value, linksection, addrspace, etc. The `nav_ty` unit, on the other
hand, resolves only the information necessary to construct a *pointer*
to the `Nav`: its type, addrspace, etc. (It does also analyze its
linksection, but that could be moved to `nav_val` I think; it doesn't
make any difference).
Analyzing a `nav_ty` for a declaration with no type annotation will just
mark a dependency on the `nav_val`, analyze it, and finish. Conversely,
analyzing a `nav_val` for a declaration *with* a type annotation will
first mark a dependency on the `nav_ty` and analyze it, using this as
the result type when evaluating the value body.
The `nav_val` and `nav_ty` units always have references to one another:
so, if a `Nav`'s type is referenced, its value implicitly is too, and
vice versa. However, these dependencies are trivial, so, to save memory,
are only known implicitly by logic in `resolveReferences`.
In general, analyzing ZIR `decl_val` will only analyze `nav_ty` of the
corresponding `Nav`. There are two exceptions to this. If the
declaration is an `extern` declaration, then we immediately ensure the
`Nav` value is resolved (which doesn't actually require any more
analysis, since such a declaration has no value body anyway).
Additionally, if the resolved type has type tag `.@"fn"`, we again
immediately resolve the `Nav` value. The latter restriction is in place
for two reasons:
* Functions are special, in that their externs are allowed to trivially
alias; i.e. with a declaration `extern fn foo(...)`, you can write
`const bar = foo;`. This is not allowed for non-function externs, and
it means that function types are the only place where it is possible
for a declaration `Nav` to have a `.@"extern"` value without actually
being declared `extern`. We need to identify this situation
immediately so that the `decl_ref` can create a pointer to the *real*
extern `Nav`, not this alias.
* In certain situations, such as taking a pointer to a `Nav`, Sema needs
to queue analysis of a runtime function if the value is a function. To
do this, the function value needs to be known, so we need to resolve
the value immediately upon `&foo` where `foo` is a function.
This restriction is simple to codify into the eventual language
specification, and doesn't limit the utility of this feature in
practice.
A consequence of this commit is that codegen and linking logic needs to
be more careful when looking at `Nav`s. In general:
* When `updateNav` or `updateFunc` is called, it is safe to assume that
the `Nav` being updated (the owner `Nav` for `updateFunc`) is fully
resolved.
* Any `Nav` whose value is/will be an `@"extern"` or a function is fully
resolved; see `Nav.getExtern` for a helper for a common case here.
* Any other `Nav` may only have its type resolved.
This didn't seem to be too tricky to satisfy in any of the existing
codegen/linker backends.
Resolves: #1311 parent 40aafcd commit 3afda43
File tree
22 files changed
+1033
-410
lines changed- src
- Sema
- Zcu
- arch/wasm
- codegen
- link
- Elf
- MachO
- Wasm
- test
- behavior
- cases/compile_errors
22 files changed
+1033
-410
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2906 | 2906 | | |
2907 | 2907 | | |
2908 | 2908 | | |
| 2909 | + | |
2909 | 2910 | | |
2910 | 2911 | | |
2911 | 2912 | | |
| |||
2949 | 2950 | | |
2950 | 2951 | | |
2951 | 2952 | | |
| 2953 | + | |
2952 | 2954 | | |
2953 | 2955 | | |
2954 | 2956 | | |
| |||
2979 | 2981 | | |
2980 | 2982 | | |
2981 | 2983 | | |
| 2984 | + | |
| 2985 | + | |
2982 | 2986 | | |
2983 | 2987 | | |
2984 | 2988 | | |
| |||
3145 | 3149 | | |
3146 | 3150 | | |
3147 | 3151 | | |
3148 | | - | |
| 3152 | + | |
3149 | 3153 | | |
3150 | 3154 | | |
3151 | 3155 | | |
| |||
3380 | 3384 | | |
3381 | 3385 | | |
3382 | 3386 | | |
3383 | | - | |
| 3387 | + | |
3384 | 3388 | | |
3385 | 3389 | | |
3386 | 3390 | | |
| |||
3647 | 3651 | | |
3648 | 3652 | | |
3649 | 3653 | | |
| 3654 | + | |
3650 | 3655 | | |
3651 | 3656 | | |
3652 | 3657 | | |
| |||
3679 | 3684 | | |
3680 | 3685 | | |
3681 | 3686 | | |
3682 | | - | |
| 3687 | + | |
3683 | 3688 | | |
3684 | 3689 | | |
3685 | 3690 | | |
| |||
3709 | 3714 | | |
3710 | 3715 | | |
3711 | 3716 | | |
| 3717 | + | |
3712 | 3718 | | |
3713 | 3719 | | |
3714 | 3720 | | |
| |||
3734 | 3740 | | |
3735 | 3741 | | |
3736 | 3742 | | |
3737 | | - | |
| 3743 | + | |
3738 | 3744 | | |
3739 | 3745 | | |
3740 | 3746 | | |
| |||
0 commit comments