[llvm-dev] Are unknown types now intentionally casual?

Russell Wallace via llvm-dev llvm-dev at lists.llvm.org
Sat Jan 8 20:20:06 PST 2022


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>


More information about the llvm-dev mailing list