ksaunders added a comment.

Hi Aaron. Unfortunately, I don't feel I can make a great case for why these 
extensions should be in Clang. Although there are users of Plan 9 C extensions, 
I don't see these features being adopted more generally enough to warrant its 
inclusion in Clang which violates the inclusion policy.

To this effect, I tried using libTooling to rewrite Plan 9 C to standard C that 
can be correctly compiled with Clang, but because the AST creation requires 
semantic analysis to run it leaves the AST in a state of disrepair (it can 
parse Plan 9 C, but the analyzer gets confused with duplicate fields and so on).

I'll have to decide if I am going to keep these changes in a Clang fork or 
modify another C compiler for LLVM. Regardless, I believe my diffs for adding 
the Plan 9 calling convention to LLVM still apply (they are simple), so I will 
send them upstream when I feel they are ready.

---

I think it also makes sense to address your questions here for the sake of 
completeness.

> I'm wondering if you could go into a bit more detail about what Automatic 
> embedded structure type decay and Embedded structure type name accesses mean 
> in practice (some code examples would be helpful).

Absolutely. "Automatic embedded structure type decay" and "Embedded structure 
type name accesses" are features best described by example:

  typedef struct Lock Lock;
  typedef struct Rc Rc;
  typedef struct Resource Resource;
  
  struct Lock
  {
    int hold;
  };
  
  struct Rc
  {
    int references;
  }:
  
  struct Resource
  {
    Rc;
    Lock;
    void *buffer;
    size_t size;
  };

Now with "Embedded structure type name accesses" enabled, if we have a value 
like `Resource *r`, we can do `r->Lock`. This simply returns the field as if 
`Lock;` was declared as `Lock Lock;`, but this special declaration also brings 
all names into scope (like an anonymous struct) so we can do `r->hold`. This 
also does NOT work if you declare the field as `struct Lock;`, it must be a 
typedef name.

Further, with "Automatic embedded structure type decay" structure pointers are 
automatically converted into an access of an embedded compatible structure. So 
we have a function like: `void lock(Lock *);` we can call it with `lock(r);` 
and the compiler will automatically search all unnamed structures in `Resource` 
recursively until it finds a matching type. Note that `Lock;` is declared after 
`Rc;`, this is intentional. In standard C it is possible to have a pointer to a 
struct declay to a pointer to the first field in the struct. That is completely 
separate from this extension.

If that was unclear, GCC also supports this functionality and it is documented 
here for a different explanation: 
https://gcc.gnu.org/onlinedocs/gcc/Unnamed-Fields.html

> Are you planning to add a new driver for Clang to emulate the Plan 9 compiler 
> driver (similar to how we have a driver for MSVC compatibility)?

For now, no.

Adding the Plan 9 object format to LLD is out-of-scope for this project (this 
was discussed previously 
<https://discourse.llvm.org/t/plan-9-a-out-executables-with-lld/61438>) so I 
don't think it's necessary to add a new driver, we can just use the generic ELF 
driver.

Similarly, adding the Plan 9 assembler syntax is not necessary either as most 
programs are C so the assembler can be trivially converted as the idea is that 
programs will be compiled with the Plan 9 calling convention and C ABI.

> Are there other extensions planned, or is the list in the summary pretty 
> complete?

No, the listing above is complete.

> Do I understand correctly that plan 9 compatibility mode forces C89 as the 
> language standard mode, or is it expected that users can do things like 
> -std=c2x -fplan9-extensions?

Plan 9 C extensions are not mutually exclusive with C2x so I think that you 
should be allowed to write C2x Plan 9 C. If we did have a Plan 9 driver though, 
it would set `-fplan9-extensions -std=c89` to be as close as possible to the 
Plan 9 compilers functionality.

Cheers


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D127462/new/

https://reviews.llvm.org/D127462

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to