> On Apr 2, 2019, at 5:39 PM, Erik Joelsson <erik.joels...@oracle.com> wrote:
> 
> In JDK-8204551, exceptions.hpp started using THIS_FILE instead of __FILE__ to 
> generate exception messages. This is causing the precompiled header to no 
> longer provide any benefit on Linux/GCC. The problem is that the THIS_FILE 
> macro is provided on the command line and is different for each compile unit. 
> Because of this, it seems GCC invalidates the precompiled header completely. 
> (On other platforms, the value of THIS_FILE is instead ignored).
> 
> The goal of JDK-8204551 was to shorten the path to the file where an 
> exception was raised to avoid truncation. This patch provides a different 
> approach to achieve this, that also fixes the issue for other platforms and 
> compilers. It also fixes the performance issue with precompiled headers.
> 
> For Hotspot (at least for now), we stop setting -DTHIS_FILE on the compiler 
> command line completely. Instead this macro is defined in macros.hpp, based 
> on __FILE__ but with an offest. This offset is calculated in configure. For 
> newer versions of GCC (8+) there is a new flag, -fmacro-prefix-map=, which 
> can be used to rewrite the __FILE__ macro. Configure checks if this flag is 
> available and uses it instead of the offset macro if possible.
> 
> I only touched the one usage of THIS_FILE/__FILE__ in this patch. It's 
> possible we should rewrite all references to __FILE__ to improve debug/error.
> 
> Bug: https://bugs.openjdk.java.net/browse/JDK-8221851
> 
> Webrev: http://cr.openjdk.java.net/~erikj/8221851/webrev.01/index.html
> 
> /Erik

Here's an alternative approach that seems simpler. Don't pass
THIS_FILE to HotSpot code (or ignore it if that works). Instead add

inline const char* this_file_helper(const char* s) {
  const char* result = strrchr(s, '/');
  return (result == NULL) ? s : (result + 1);
}

and in the one place where HotSpot is using THIS_FILE
(exceptions.hpp), instead use

  this_file_helper(__FILE__)

(This assumes the path separator is '/', but there's probably a
constant for that somewhere if it's needed.)

(this_file_helper() is only needed to deal with the case where
__FILE__ contains no path separators; that might not even be an issue,
in which case it can be dropped and just add 1 to the strrchr result.
Also not wedded to that name; this is more or less basename(3).)

Empirically, gcc will optimize that all quite nicely. I don't know
about other platforms, but the worst that happens is we take a small
runtime hit when "throwing" an exception.

This doesn't eliminate the full pathname string embedded in the
executable, but I don't think the proposed FILE_MACRO_OFFSET will do
that either.  Those get fixed by -fmacro-prefix-map=.


Reply via email to