[PATCH] D127462: Begin implementing Plan 9 C extensions [V2]

Keegan Saunders via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Thu Jun 9 17:55:36 PDT 2022


ksaunders created this revision.
ksaunders added a reviewer: rsmith.
ksaunders added a project: clang.
Herald added a project: All.
ksaunders requested review of this revision.
Herald added subscribers: cfe-commits, MaskRay.

This patch enables the addition of extensions supported by the Plan 9 C compilers by adding the -fplan9-extensions flag.

This flag currently enables 1 extension: allowing typedefs to be declared multiple times like in C11. Once merged, I have plans to implement the following Plan 9 C compiler behavior, as covered below.

Plan 9 C compilers can be summarized as a C89 compiler with the following non-standard extensions enabled:

- Embedded structures, like Microsoft C (already implemented in Clang with -fms-extensions)
- Automatic embedded structure type decay
- Embedded structure type name accesses

As well as the following standardized C extensions enabled:

- C99 compound literals
- C99 designated initializers for arrays and structures
- C11 redeclaration of typedefs
- C11 anonymous structures and unions
- C2x omitting the parameter name in a function definition

A description of these extensions can be found in the //How to Use the Plan 9 C Compiler// paper by Rob Pike: https://9p.io/sys/doc/comp.html. However, there are no plans to implement the "extern register" feature, which is used in the kernel.

The motivation for this patch, and the patches that follow, are to enable the compilation of the Plan 9 kernel C source and Plan 9 userspace applications with Clang for the purpose of increased code optimizations and sanitizer instrumentation. In this respect, GCC support is inadequate, as it does not support the member resolution algorithm used in the Plan 9 C compilers to reconcile overlapping declaration names in a record.

This patch is largely based off of the following obsolete patch by @pcc: https://reviews.llvm.org/D3853.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D127462

Files:
  clang/include/clang/Basic/LangOptions.def
  clang/include/clang/Driver/Options.td
  clang/lib/Driver/ToolChains/Clang.cpp
  clang/lib/Sema/SemaDecl.cpp
  clang/test/Sema/c11-typedef-redef.c


Index: clang/test/Sema/c11-typedef-redef.c
===================================================================
--- clang/test/Sema/c11-typedef-redef.c
+++ clang/test/Sema/c11-typedef-redef.c
@@ -1,4 +1,5 @@
 // RUN: %clang_cc1 -std=c11 %s -verify
+// RUN: %clang_cc1 -fplan9-extensions %s -verify
 
 typedef int type;
 typedef type type;
Index: clang/lib/Sema/SemaDecl.cpp
===================================================================
--- clang/lib/Sema/SemaDecl.cpp
+++ clang/lib/Sema/SemaDecl.cpp
@@ -2560,8 +2560,8 @@
     return New->setInvalidDecl();
   }
 
-  // Modules always permit redefinition of typedefs, as does C11.
-  if (getLangOpts().Modules || getLangOpts().C11)
+  // Modules always permit redefinition of typedefs, as do C11 and Plan 9.
+  if (getLangOpts().Modules || getLangOpts().C11 || getLangOpts().Plan9)
     return;
 
   // If we have a redefinition of a typedef in C, emit a warning.  This warning
Index: clang/lib/Driver/ToolChains/Clang.cpp
===================================================================
--- clang/lib/Driver/ToolChains/Clang.cpp
+++ clang/lib/Driver/ToolChains/Clang.cpp
@@ -6495,6 +6495,9 @@
   Args.addOptInFlag(CmdArgs, options::OPT_fborland_extensions,
                     options::OPT_fno_borland_extensions);
 
+  Args.addOptInFlag(CmdArgs, options::OPT_fplan9_extensions,
+                    options::OPT_fno_plan9_extensions);
+
   // -fno-declspec is default, except for PS4/PS5.
   if (Args.hasFlag(options::OPT_fdeclspec, options::OPT_fno_declspec,
                    RawTriple.isPS()))
Index: clang/include/clang/Driver/Options.td
===================================================================
--- clang/include/clang/Driver/Options.td
+++ clang/include/clang/Driver/Options.td
@@ -1343,6 +1343,10 @@
   LangOpts<"Borland">, DefaultFalse,
   PosFlag<SetTrue, [CC1Option], "Accept non-standard constructs supported by the Borland compiler">,
   NegFlag<SetFalse>>;
+defm plan9_extensions : BoolFOption<"plan9-extensions",
+  LangOpts<"Plan9">, DefaultFalse,
+  PosFlag<SetTrue, [CC1Option], "Accept non-standard constructs supported by the Plan 9 compiler">,
+  NegFlag<SetFalse>>;
 def fbuiltin : Flag<["-"], "fbuiltin">, Group<f_Group>, Flags<[CoreOption]>;
 def fbuiltin_module_map : Flag <["-"], "fbuiltin-module-map">, Group<f_Group>,
   Flags<[NoXarchOption]>, HelpText<"Load the clang builtins module map file.">;
Index: clang/include/clang/Basic/LangOptions.def
===================================================================
--- clang/include/clang/Basic/LangOptions.def
+++ clang/include/clang/Basic/LangOptions.def
@@ -92,6 +92,7 @@
 LANGOPT(MicrosoftExt      , 1, 0, "Microsoft C++ extensions")
 LANGOPT(AsmBlocks         , 1, 0, "Microsoft inline asm blocks")
 LANGOPT(Borland           , 1, 0, "Borland extensions")
+LANGOPT(Plan9             , 1, 0, "Plan 9 extensions")
 LANGOPT(CPlusPlus         , 1, 0, "C++")
 LANGOPT(CPlusPlus11       , 1, 0, "C++11")
 LANGOPT(CPlusPlus14       , 1, 0, "C++14")


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D127462.435746.patch
Type: text/x-patch
Size: 2998 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20220610/c36b7352/attachment-0001.bin>


More information about the cfe-commits mailing list