MaskRay created this revision.
MaskRay added reviewers: dexonsmith, jansvoboda11.
MaskRay requested review of this revision.
Herald added a project: clang.
Herald added a subscriber: cfe-commits.

  % diff <(gcc -fno-asynchronous-unwind-tables -dM -E a.c) <(gcc -dM -E a.c)
  130a131
  > #define __GCC_HAVE_DWARF2_CFI_ASM 1

This macro is useful because code can decide whether inline asm should include 
`.cfi_*` directives.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D97743

Files:
  clang/lib/Frontend/CompilerInvocation.cpp
  clang/test/Preprocessor/unwind-tables.c


Index: clang/test/Preprocessor/unwind-tables.c
===================================================================
--- /dev/null
+++ clang/test/Preprocessor/unwind-tables.c
@@ -0,0 +1,15 @@
+// RUN: %clang_cc1 %s -verify -munwind-tables -DCFI_ASM -triple 
x86_64-unknown-elf
+// RUN: %clang_cc1 %s -verify -munwind-tables -DCFI_ASM -triple 
aarch64-apple-darwin
+// RUN: %clang_cc1 %s -verify -munwind-tables -triple x86_64-windows
+
+// expected-no-diagnostics
+
+#ifdef CFI_ASM
+  #if __GCC_HAVE_DWARF2_CFI_ASM != 1
+  #error "__GCC_HAVE_DWARF2_CFI_ASM not defined"
+  #endif
+#else
+  #ifdef __GCC_HAVE_DWARF2_CFI_ASM
+  #error "__GCC_HAVE_DWARF2_CFI_ASM defined"
+  #endif
+#endif
Index: clang/lib/Frontend/CompilerInvocation.cpp
===================================================================
--- clang/lib/Frontend/CompilerInvocation.cpp
+++ clang/lib/Frontend/CompilerInvocation.cpp
@@ -4045,8 +4045,8 @@
 
 static bool ParsePreprocessorArgs(PreprocessorOptions &Opts, ArgList &Args,
                                   DiagnosticsEngine &Diags,
-                                  frontend::ActionKind Action,
-                                  const FrontendOptions &FrontendOpts) {
+                                  const FrontendOptions &FrontendOpts,
+                                  const llvm::Triple &T) {
   PreprocessorOptions *PreprocessorOpts = &Opts;
   bool Success = true;
 
@@ -4101,6 +4101,10 @@
       Opts.addMacroDef("__CET__=3");
   }
 
+  if (Args.hasArg(OPT_munwind_tables) &&
+      (T.isOSBinFormatELF() || T.isOSBinFormatMachO()))
+    Opts.addMacroDef("__GCC_HAVE_DWARF2_CFI_ASM=1");
+
   // Add macros from the command line.
   for (const auto *A : Args.filtered(OPT_D, OPT_U)) {
     if (A->getOption().matches(OPT_D))
@@ -4130,7 +4134,7 @@
   // Always avoid lexing editor placeholders when we're just running the
   // preprocessor as we never want to emit the
   // "editor placeholder in source file" error in PP only mode.
-  if (isStrictlyPreprocessorAction(Action))
+  if (isStrictlyPreprocessorAction(FrontendOpts.ProgramAction))
     Opts.LexEditorPlaceholders = false;
 
   return Success;
@@ -4325,8 +4329,7 @@
       !LangOpts.Sanitize.has(SanitizerKind::KernelMemory);
 
   ParsePreprocessorArgs(Res.getPreprocessorOpts(), Args, Diags,
-                        Res.getFrontendOpts().ProgramAction,
-                        Res.getFrontendOpts());
+                        Res.getFrontendOpts(), T);
   ParsePreprocessorOutputArgs(Res.getPreprocessorOutputOpts(), Args, Diags,
                               Res.getFrontendOpts().ProgramAction);
 


Index: clang/test/Preprocessor/unwind-tables.c
===================================================================
--- /dev/null
+++ clang/test/Preprocessor/unwind-tables.c
@@ -0,0 +1,15 @@
+// RUN: %clang_cc1 %s -verify -munwind-tables -DCFI_ASM -triple x86_64-unknown-elf
+// RUN: %clang_cc1 %s -verify -munwind-tables -DCFI_ASM -triple aarch64-apple-darwin
+// RUN: %clang_cc1 %s -verify -munwind-tables -triple x86_64-windows
+
+// expected-no-diagnostics
+
+#ifdef CFI_ASM
+  #if __GCC_HAVE_DWARF2_CFI_ASM != 1
+  #error "__GCC_HAVE_DWARF2_CFI_ASM not defined"
+  #endif
+#else
+  #ifdef __GCC_HAVE_DWARF2_CFI_ASM
+  #error "__GCC_HAVE_DWARF2_CFI_ASM defined"
+  #endif
+#endif
Index: clang/lib/Frontend/CompilerInvocation.cpp
===================================================================
--- clang/lib/Frontend/CompilerInvocation.cpp
+++ clang/lib/Frontend/CompilerInvocation.cpp
@@ -4045,8 +4045,8 @@
 
 static bool ParsePreprocessorArgs(PreprocessorOptions &Opts, ArgList &Args,
                                   DiagnosticsEngine &Diags,
-                                  frontend::ActionKind Action,
-                                  const FrontendOptions &FrontendOpts) {
+                                  const FrontendOptions &FrontendOpts,
+                                  const llvm::Triple &T) {
   PreprocessorOptions *PreprocessorOpts = &Opts;
   bool Success = true;
 
@@ -4101,6 +4101,10 @@
       Opts.addMacroDef("__CET__=3");
   }
 
+  if (Args.hasArg(OPT_munwind_tables) &&
+      (T.isOSBinFormatELF() || T.isOSBinFormatMachO()))
+    Opts.addMacroDef("__GCC_HAVE_DWARF2_CFI_ASM=1");
+
   // Add macros from the command line.
   for (const auto *A : Args.filtered(OPT_D, OPT_U)) {
     if (A->getOption().matches(OPT_D))
@@ -4130,7 +4134,7 @@
   // Always avoid lexing editor placeholders when we're just running the
   // preprocessor as we never want to emit the
   // "editor placeholder in source file" error in PP only mode.
-  if (isStrictlyPreprocessorAction(Action))
+  if (isStrictlyPreprocessorAction(FrontendOpts.ProgramAction))
     Opts.LexEditorPlaceholders = false;
 
   return Success;
@@ -4325,8 +4329,7 @@
       !LangOpts.Sanitize.has(SanitizerKind::KernelMemory);
 
   ParsePreprocessorArgs(Res.getPreprocessorOpts(), Args, Diags,
-                        Res.getFrontendOpts().ProgramAction,
-                        Res.getFrontendOpts());
+                        Res.getFrontendOpts(), T);
   ParsePreprocessorOutputArgs(Res.getPreprocessorOutputOpts(), Args, Diags,
                               Res.getFrontendOpts().ProgramAction);
 
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to