Russell Wallace via llvm-dev
2022-Jan-09 04:20 UTC
[llvm-dev] Are unknown types now intentionally casual?
Given the following code:
struct Unknown;
extern struct Unknown Unknown;
struct Unknown *foo(void) {
return &Unknown;
}
And compiling it with a recent (trunk of a few days ago) clang with default
options gives (abridged):
%struct.Unknown = type opaque
@Unknown = external dso_local global %struct.Unknown, align 1
; Function Attrs: noinline nounwind optnone uwtable
define dso_local %struct.Unknown* @foo() #0 {
entry:
ret %struct.Unknown* @Unknown
}
Okay, so I think I understand what's going on there. Now, trying the same
input with the same compiler and adding the option -mllvm -opaque-pointers
(because opaque pointers are good; I think they are a very worthwhile
simplification):
@Unknown = external dso_local global %struct.Unknown, align 1
; Function Attrs: noinline nounwind optnone uwtable
define dso_local ptr @foo() #0 {
entry:
ret ptr @Unknown
}
So that's mostly clear except one thing I'm not quite clear
about: %struct.Unknown is referred to, but not declared anywhere. Is that
intentional? Is the rule now intended to be that whenever a %type.name is
used that was not declared anywhere, it should be taken to be an opaque
type? (I'm fine with that if it is, just figure I better make sure.)
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://lists.llvm.org/pipermail/llvm-dev/attachments/20220109/b7c3d1fb/attachment.html>
Russell Wallace via llvm-dev
2022-Jan-09 05:29 UTC
[llvm-dev] Are unknown types now intentionally casual?
... no, when I feed the second output as input into clang again, it objects
to the undeclared type:
(c1) C:\t>clang -mllvm -opaque-pointers 2.ll
2.ll:6:38: error: use of undefined type named 'struct.Unknown'
@Unknown = external dso_local global %struct.Unknown, align 1
^
1 error generated.
So this seems to be just a bug in this particular version of clang,
probably because the opaque pointers conversion is still a work in progress?
On Sun, Jan 9, 2022 at 4:20 AM Russell Wallace <russell.wallace at
gmail.com>
wrote:
> Given the following code:
>
> struct Unknown;
> extern struct Unknown Unknown;
>
> struct Unknown *foo(void) {
> return &Unknown;
> }
>
> And compiling it with a recent (trunk of a few days ago) clang with
> default options gives (abridged):
>
> %struct.Unknown = type opaque
>
> @Unknown = external dso_local global %struct.Unknown, align 1
>
> ; Function Attrs: noinline nounwind optnone uwtable
> define dso_local %struct.Unknown* @foo() #0 {
> entry:
> ret %struct.Unknown* @Unknown
> }
>
> Okay, so I think I understand what's going on there. Now, trying the
same
> input with the same compiler and adding the option -mllvm -opaque-pointers
> (because opaque pointers are good; I think they are a very worthwhile
> simplification):
>
> @Unknown = external dso_local global %struct.Unknown, align 1
>
> ; Function Attrs: noinline nounwind optnone uwtable
> define dso_local ptr @foo() #0 {
> entry:
> ret ptr @Unknown
> }
>
> So that's mostly clear except one thing I'm not quite clear
> about: %struct.Unknown is referred to, but not declared anywhere. Is that
> intentional? Is the rule now intended to be that whenever a %type.name is
> used that was not declared anywhere, it should be taken to be an opaque
> type? (I'm fine with that if it is, just figure I better make sure.)
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://lists.llvm.org/pipermail/llvm-dev/attachments/20220109/0fc277e7/attachment.html>