r360833 - [Clang][PP] Add the __FILE_NAME__ builtin macro.

via cfe-commits cfe-commits at lists.llvm.org
Wed May 15 19:26:33 PDT 2019


Hi Kristina,

Your change does not seem to be working on Windows. Can you take a look?

http://lab.llvm.org:8011/builders/clang-x64-windows-msvc/builds/6860

FAIL: Clang :: Preprocessor/file_name_macro.c (7959 of 14753)
******************** TEST 'Clang :: Preprocessor/file_name_macro.c' FAILED ********************
Script:
--
: 'RUN: at line 1';   c:\b\slave\clang-x64-windows-msvc\build\build\stage1\bin\clang.exe -cc1 -internal-isystem c:\b\slave\clang-x64-windows-msvc\build\build\stage1\lib\clang\9.0.0\include -nostdsysteminc -E C:\b\slave\clang-x64-windows-msvc\build\llvm.src\tools\clang\test\Preprocessor\file_name_macro.c -IC:\b\slave\clang-x64-windows-msvc\build\llvm.src\tools\clang\test\Preprocessor/Inputs | c:\b\slave\clang-x64-windows-msvc\build\build\stage1\bin\filecheck.exe -strict-whitespace C:\b\slave\clang-x64-windows-msvc\build\llvm.src\tools\clang\test\Preprocessor\file_name_macro.c
: 'RUN: at line 2';   c:\b\slave\clang-x64-windows-msvc\build\build\stage1\bin\clang.exe -cc1 -internal-isystem c:\b\slave\clang-x64-windows-msvc\build\build\stage1\lib\clang\9.0.0\include -nostdsysteminc -fms-compatibility -DMS -E C:\b\slave\clang-x64-windows-msvc\build\llvm.src\tools\clang\test\Preprocessor\file_name_macro.c -IC:\b\slave\clang-x64-windows-msvc\build\llvm.src\tools\clang\test\Preprocessor/Inputs | c:\b\slave\clang-x64-windows-msvc\build\build\stage1\bin\filecheck.exe -check-prefix=CHECK-MS -strict-whitespace C:\b\slave\clang-x64-windows-msvc\build\llvm.src\tools\clang\test\Preprocessor\file_name_macro.c
: 'RUN: at line 3';   c:\b\slave\clang-x64-windows-msvc\build\build\stage1\bin\clang.exe -cc1 -internal-isystem c:\b\slave\clang-x64-windows-msvc\build\build\stage1\lib\clang\9.0.0\include -nostdsysteminc -E C:\b\slave\clang-x64-windows-msvc\build\llvm.src\tools\clang\test\Preprocessor\file_name_macro.c -IC:\b\slave\clang-x64-windows-msvc\build\llvm.src\tools\clang\test\Preprocessor/Inputs -DBADINC -verify
--
Exit Code: 1

Command Output (stdout):
--
$ ":" "RUN: at line 1"
$ "c:\b\slave\clang-x64-windows-msvc\build\build\stage1\bin\clang.exe" "-cc1" "-internal-isystem" "c:\b\slave\clang-x64-windows-msvc\build\build\stage1\lib\clang\9.0.0\include" "-nostdsysteminc" "-E" "C:\b\slave\clang-x64-windows-msvc\build\llvm.src\tools\clang\test\Preprocessor\file_name_macro.c" "-IC:\b\slave\clang-x64-windows-msvc\build\llvm.src\tools\clang\test\Preprocessor/Inputs"
$ "c:\b\slave\clang-x64-windows-msvc\build\build\stage1\bin\filecheck.exe" "-strict-whitespace" "C:\b\slave\clang-x64-windows-msvc\build\llvm.src\tools\clang\test\Preprocessor\file_name_macro.c"
# command stderr:
C:\b\slave\clang-x64-windows-msvc\build\llvm.src\tools\clang\test\Preprocessor\file_name_macro.c:22:11: error: CHECK: expected string not found in input

// CHECK: {{^}}2: "file_name_macro.c"

          ^

<stdin>:12:1: note: scanning from here

2: "C:\\b\\slave\\clang-x64-windows-msvc\\build\\llvm.src\\tools\\clang\\test\\Preprocessor\\file_name_macro.c"

^

<stdin>:12:87: note: possible intended match here

2: "C:\\b\\slave\\clang-x64-windows-msvc\\build\\llvm.src\\tools\\clang\\test\\Preprocessor\\file_name_macro.c"

                                                                                      ^


error: command failed with exit status: 1

Douglas Yung

-----Original Message-----
From: cfe-commits <cfe-commits-bounces at lists.llvm.org> On Behalf Of Kristina Brooks via cfe-commits
Sent: Wednesday, May 15, 2019 17:53
To: cfe-commits at lists.llvm.org
Subject: r360833 - [Clang][PP] Add the __FILE_NAME__ builtin macro.

Author: kristina
Date: Wed May 15 17:52:41 2019
New Revision: 360833

URL: http://llvm.org/viewvc/llvm-project?rev=360833&view=rev
Log:
[Clang][PP] Add the __FILE_NAME__ builtin macro.

This patch adds the `__FILE_NAME__` macro that expands to the last component of the path, similar to `__FILE__` except with a guarantee that only the last path component (without the
separator) will be rendered.

I intend to follow through with discussion of this with WG14 as a potential inclusion in the C standard or failing that, try to discuss this with GCC developers since this extension is desired by GCC and Clang users/developers alike.

Differential Revision: https://reviews.llvm.org/D61756


Added:
    cfe/trunk/test/Preprocessor/Inputs/include-subdir/
    cfe/trunk/test/Preprocessor/Inputs/include-subdir/file_name_macro_include.h
    cfe/trunk/test/Preprocessor/Inputs/include-subdir/h
    cfe/trunk/test/Preprocessor/Inputs/include-subdir/subdir1/
    cfe/trunk/test/Preprocessor/Inputs/include-subdir/subdir1/hdr1.h
    cfe/trunk/test/Preprocessor/Inputs/include-subdir/subdir1/hdr2.h
    cfe/trunk/test/Preprocessor/file_name_macro.c
Modified:
    cfe/trunk/include/clang/Lex/Preprocessor.h
    cfe/trunk/lib/Lex/PPMacroExpansion.cpp

Modified: cfe/trunk/include/clang/Lex/Preprocessor.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Lex/Preprocessor.h?rev=360833&r1=360832&r2=360833&view=diff
==============================================================================
--- cfe/trunk/include/clang/Lex/Preprocessor.h (original)
+++ cfe/trunk/include/clang/Lex/Preprocessor.h Wed May 15 17:52:41 2019
@@ -147,6 +147,7 @@ class Preprocessor {
   IdentifierInfo *Ident__DATE__, *Ident__TIME__;   // __DATE__, __TIME__
   IdentifierInfo *Ident__INCLUDE_LEVEL__;          // __INCLUDE_LEVEL__
   IdentifierInfo *Ident__BASE_FILE__;              // __BASE_FILE__
+  IdentifierInfo *Ident__FILE_NAME__;              // __FILE_NAME__
   IdentifierInfo *Ident__TIMESTAMP__;              // __TIMESTAMP__
   IdentifierInfo *Ident__COUNTER__;                // __COUNTER__
   IdentifierInfo *Ident_Pragma, *Ident__pragma;    // _Pragma, __pragma

Modified: cfe/trunk/lib/Lex/PPMacroExpansion.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Lex/PPMacroExpansion.cpp?rev=360833&r1=360832&r2=360833&view=diff
==============================================================================
--- cfe/trunk/lib/Lex/PPMacroExpansion.cpp (original)
+++ cfe/trunk/lib/Lex/PPMacroExpansion.cpp Wed May 15 17:52:41 2019
@@ -363,6 +363,7 @@ void Preprocessor::RegisterBuiltinMacros
   }
 
   // Clang Extensions.
+  Ident__FILE_NAME__      = RegisterBuiltinMacro(*this, "__FILE_NAME__");
   Ident__has_feature      = RegisterBuiltinMacro(*this, "__has_feature");
   Ident__has_extension    = RegisterBuiltinMacro(*this, "__has_extension");
   Ident__has_builtin      = RegisterBuiltinMacro(*this, "__has_builtin");
@@ -1474,7 +1475,8 @@ void Preprocessor::ExpandBuiltinMacro(To
     // __LINE__ expands to a simple numeric value.
     OS << (PLoc.isValid()? PLoc.getLine() : 1);
     Tok.setKind(tok::numeric_constant);
-  } else if (II == Ident__FILE__ || II == Ident__BASE_FILE__) {
+  } else if (II == Ident__FILE__ || II == Ident__BASE_FILE__ ||
+             II == Ident__FILE_NAME__) {
     // C99 6.10.8: "__FILE__: The presumed name of the current source file (a
     // character string literal)". This can be affected by #line.
     PresumedLoc PLoc = SourceMgr.getPresumedLoc(Tok.getLocation());
@@ -1495,7 +1497,21 @@ void Preprocessor::ExpandBuiltinMacro(To
     // Escape this filename.  Turn '\' -> '\\' '"' -> '\"'
     SmallString<128> FN;
     if (PLoc.isValid()) {
-      FN += PLoc.getFilename();
+      // __FILE_NAME__ is a Clang-specific extension that expands to the
+      // the last part of __FILE__.
+      if (II == Ident__FILE_NAME__) {
+        // Try to get the last path component.
+        StringRef PLFileName = PLoc.getFilename(); 
+        size_t LastSep = PLFileName.find_last_of('/');        
+        // Skip the separator and get the last part, otherwise fall back on
+        // returning the original full filename.
+        if (LastSep != StringRef::npos)
+          FN += PLFileName.substr(LastSep+1);
+        else
+          FN += PLFileName;
+      } else {
+        FN += PLoc.getFilename();
+      }
       Lexer::Stringify(FN);
       OS << '"' << FN << '"';
     }

Added: cfe/trunk/test/Preprocessor/Inputs/include-subdir/file_name_macro_include.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Preprocessor/Inputs/include-subdir/file_name_macro_include.h?rev=360833&view=auto
==============================================================================
--- cfe/trunk/test/Preprocessor/Inputs/include-subdir/file_name_macro_include.h (added)
+++ cfe/trunk/test/Preprocessor/Inputs/include-subdir/file_name_macro_in
+++ clude.h Wed May 15 17:52:41 2019
@@ -0,0 +1,6 @@
+3: __FILE_NAME__
+4: "file_name_macro_include.h"
+#ifdef MS
+// Should be the same even when included with backslash.
+5: __FILE_NAME__
+#endif

Added: cfe/trunk/test/Preprocessor/Inputs/include-subdir/h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Preprocessor/Inputs/include-subdir/h?rev=360833&view=auto
==============================================================================
--- cfe/trunk/test/Preprocessor/Inputs/include-subdir/h (added)
+++ cfe/trunk/test/Preprocessor/Inputs/include-subdir/h Wed May 15 
+++ 17:52:41 2019
@@ -0,0 +1 @@
+6: __FILE_NAME__

Added: cfe/trunk/test/Preprocessor/Inputs/include-subdir/subdir1/hdr1.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Preprocessor/Inputs/include-subdir/subdir1/hdr1.h?rev=360833&view=auto
==============================================================================
--- cfe/trunk/test/Preprocessor/Inputs/include-subdir/subdir1/hdr1.h (added)
+++ cfe/trunk/test/Preprocessor/Inputs/include-subdir/subdir1/hdr1.h Wed 
+++ May 15 17:52:41 2019
@@ -0,0 +1 @@
+7: __FILE_NAME__

Added: cfe/trunk/test/Preprocessor/Inputs/include-subdir/subdir1/hdr2.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Preprocessor/Inputs/include-subdir/subdir1/hdr2.h?rev=360833&view=auto
==============================================================================
--- cfe/trunk/test/Preprocessor/Inputs/include-subdir/subdir1/hdr2.h (added)
+++ cfe/trunk/test/Preprocessor/Inputs/include-subdir/subdir1/hdr2.h Wed 
+++ May 15 17:52:41 2019
@@ -0,0 +1 @@
+8: __FILE_NAME__

Added: cfe/trunk/test/Preprocessor/file_name_macro.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Preprocessor/file_name_macro.c?rev=360833&view=auto
==============================================================================
--- cfe/trunk/test/Preprocessor/file_name_macro.c (added)
+++ cfe/trunk/test/Preprocessor/file_name_macro.c Wed May 15 17:52:41 
+++ 2019
@@ -0,0 +1,44 @@
+// RUN: %clang_cc1 -E %s -I%S/Inputs | FileCheck -strict-whitespace %s 
+// RUN: %clang_cc1 -fms-compatibility -DMS -E %s -I%S/Inputs | 
+FileCheck -check-prefix=CHECK-MS -strict-whitespace %s // RUN: 
+%clang_cc1 -E %s -I%S/Inputs -DBADINC -verify
+
+#ifdef BADINC
+
+// Paranoia.
+
+__FILE_NAME__
+#include <include-subdir/> // expected-error {{file not found}} 
+__FILE_NAME__
+
+#else
+
+// Reference.
+1: "file_name_macro.c"
+
+// Ensure it expands correctly for this file.
+2: __FILE_NAME__
+
+// CHECK: {{^}}1: "file_name_macro.c"
+// CHECK: {{^}}2: "file_name_macro.c"
+
+// Test if inclusion works right.
+#ifdef MS
+#include <include-subdir\file_name_macro_include.h>
+// MS compatibility allows for mixed separators in paths.
+#include <include-subdir/subdir1\hdr1.h> #include 
+<include-subdir\subdir1/hdr2.h> #else #include 
+<include-subdir/file_name_macro_include.h>
+#endif
+
+#include <include-subdir/h>
+
+// CHECK: {{^}}3: "file_name_macro_include.h"
+// CHECK: {{^}}4: "file_name_macro_include.h"
+// CHECK-NOT: {{^}}5: "file_name_macro_include.h"
+// CHECK-MS: {{^}}5: "file_name_macro_include.h"
+// CHECK: {{^}}6: "h"
+// CHECK-MS: {{^}}7: "hdr1.h"
+// CHECK-MS: {{^}}8: "hdr2.h"
+
+#endif


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


More information about the cfe-commits mailing list