Skip to content

Commit

Permalink
test: fix DebugSymbolsTest.ReqWrapList on PPC64LE
Browse files Browse the repository at this point in the history
Currently, DebugSymbolsTest.ReqWrapList fails on PPC64LE when Node has
been configured with Link Time Optimization (LTO) and using RHEL 8.5
and gcc:
```console
$ . /opt/rh/gcc-toolset-11/enable
$ export CC='ccache gcc'
$ export CXX='ccache g++'
$ ./configure --enable-lto
$ make -j8 cctest
...
21:52:27 [ RUN      ] DebugSymbolsTest.ReqWrapList
21:52:27 ../test/cctest/test_node_postmortem_metadata.cc:203: Failure
21:52:27 Expected equality of these values:
21:52:27   expected
21:52:27     Which is: 140736537072320
21:52:27   calculated
21:52:27     Which is: 1099680328560
21:52:27 [  FAILED  ] DebugSymbolsTest.ReqWrapList (43 ms)
```

After looking into this is seems that the compiler is tampering with one
or more of the `queue`, `head`, `tail`, and `last` variables when
compiling with LTO enabled. This commit suggests adding volatile to
these variables to prevent the compiler from tampering with them.
  • Loading branch information
danbev committed Aug 22, 2022
1 parent fd07bab commit 7a40859
Showing 1 changed file with 9 additions and 6 deletions.
15 changes: 9 additions & 6 deletions test/cctest/test_node_postmortem_metadata.cc
Original file line number Diff line number Diff line change
Expand Up @@ -172,11 +172,13 @@ TEST_F(DebugSymbolsTest, ReqWrapList) {
const Argv argv;
Env env{handle_scope, argv};

auto queue = reinterpret_cast<uintptr_t>((*env)->req_wrap_queue());
auto head =
volatile uintptr_t queue =
reinterpret_cast<uintptr_t>((*env)->req_wrap_queue());
volatile uintptr_t head =
queue +
nodedbg_offset_Environment_ReqWrapQueue__head___ListNode_ReqWrapQueue;
auto tail = head + nodedbg_offset_ListNode_ReqWrap__prev___uintptr_t;
volatile uintptr_t tail = head +
nodedbg_offset_ListNode_ReqWrap__prev___uintptr_t;
tail = *reinterpret_cast<uintptr_t*>(tail);

auto obj_template = v8::FunctionTemplate::New(isolate_);
Expand All @@ -194,11 +196,12 @@ TEST_F(DebugSymbolsTest, ReqWrapList) {
// ARM64 CI machinies.
for (auto it : *(*env)->req_wrap_queue()) (void) &it;

auto last = tail + nodedbg_offset_ListNode_ReqWrap__next___uintptr_t;
volatile uintptr_t last = tail +
nodedbg_offset_ListNode_ReqWrap__next___uintptr_t;
last = *reinterpret_cast<uintptr_t*>(last);

auto expected = reinterpret_cast<uintptr_t>(&obj);
auto calculated =
volatile uintptr_t expected = reinterpret_cast<uintptr_t>(&obj);
volatile uintptr_t calculated =
last - nodedbg_offset_ReqWrap__req_wrap_queue___ListNode_ReqWrapQueue;
EXPECT_EQ(expected, calculated);

Expand Down

0 comments on commit 7a40859

Please sign in to comment.