Skip to content

Commit

Permalink
[libc++] Change workaround for init_priority((100)) outside of system…
Browse files Browse the repository at this point in the history
… headers

We had previously been using a different workaround for pretending that
we were inside a system header, however it had some undesirable effects
on dependency parsing for build systems, as explained in [1].

This patch changes the workaround to use `#pragma GCC system_header`,
which shouldn't suffer from the same issue. Unfortunately, it is a lot
more verbose. The issue is that `#pragma GCC system_header` is ignored
when we are inside a source file, so we have to create a header just for
the sake of using it. IMO this seems like an artificial restriction
without much benefit, but investigating that is a different story.
For now, this should at least solve build system problems at the
cost of some readability.

[1]: https://reviews.llvm.org/D95972#3178968

Differential Revision: https://reviews.llvm.org/D115334
  • Loading branch information
ldionne committed Dec 13, 2021
1 parent 206365b commit 515afe8
Show file tree
Hide file tree
Showing 6 changed files with 15 additions and 12 deletions.
6 changes: 3 additions & 3 deletions libcxx/src/chrono.cpp
Expand Up @@ -80,9 +80,9 @@ class GetSystemTimeInit {
GetSystemTimeAsFileTimePtr fp;
};

# 83 "chrono.cpp" 1 3
GetSystemTimeInit GetSystemTimeAsFileTimeFunc _LIBCPP_INIT_PRIORITY_MAX;
# 85 "chrono.cpp" 2
// Pretend we're inside a system header so the compiler doesn't flag the use of the init_priority
// attribute with a value that's reserved for the implementation (we're the implementation).
#include "chrono_system_time_init.h"
} // namespace

#endif
Expand Down
2 changes: 2 additions & 0 deletions libcxx/src/chrono_system_time_init.h
@@ -0,0 +1,2 @@
#pragma GCC system_header
GetSystemTimeInit GetSystemTimeAsFileTimeFunc _LIBCPP_INIT_PRIORITY_MAX;
6 changes: 3 additions & 3 deletions libcxx/src/experimental/memory_resource.cpp
Expand Up @@ -76,9 +76,9 @@ union ResourceInitHelper {
~ResourceInitHelper() {}
};

# 79 "memory_resource.cpp" 1 3
_LIBCPP_SAFE_STATIC ResourceInitHelper res_init _LIBCPP_INIT_PRIORITY_MAX;
# 81 "memory_resource.cpp" 2
// Pretend we're inside a system header so the compiler doesn't flag the use of the init_priority
// attribute with a value that's reserved for the implementation (we're the implementation).
#include "memory_resource_init_helper.h"

} // end namespace

Expand Down
2 changes: 2 additions & 0 deletions libcxx/src/experimental/memory_resource_init_helper.h
@@ -0,0 +1,2 @@
#pragma GCC system_header
_LIBCPP_SAFE_STATIC ResourceInitHelper res_init _LIBCPP_INIT_PRIORITY_MAX;
9 changes: 3 additions & 6 deletions libcxx/src/iostream.cpp
Expand Up @@ -85,12 +85,9 @@ __asm__("?wclog@" _LIBCPP_ABI_NAMESPACE_STR "@std@@3V?$basic_ostream@_WU?$char_t
;
#endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS

// Hacky way to make the compiler believe that we're inside a system header so
// it doesn't flag the use of the init_priority attribute with a value that's
// reserved for the implementation (we're the implementation).
# 80 "iostream.cpp" 1 3
_LIBCPP_HIDDEN ios_base::Init __start_std_streams _LIBCPP_INIT_PRIORITY_MAX;
# 82 "iostream.cpp" 2
// Pretend we're inside a system header so the compiler doesn't flag the use of the init_priority
// attribute with a value that's reserved for the implementation (we're the implementation).
#include "iostream_init.h"

// On Windows the TLS storage for locales needs to be initialized before we create
// the standard streams, otherwise it may not be alive during program termination
Expand Down
2 changes: 2 additions & 0 deletions libcxx/src/iostream_init.h
@@ -0,0 +1,2 @@
#pragma GCC system_header
_LIBCPP_HIDDEN ios_base::Init __start_std_streams _LIBCPP_INIT_PRIORITY_MAX;

0 comments on commit 515afe8

Please sign in to comment.