The compiler does not recognize HACKY_CALL as a call
(we intentionally hide it from the compiler so that it can
compile non-leaf functions as leaf functions).
To compensate for that hacky call thunk saves and restores
all caller-saved registers. However, it saves only
general-purposes registers and does not save XMM registers.
This is a latent bug that was masked up until a recent "NFC" commit
d736002e90 ("tsan: move memory access functions to a separate file"),
which allowed more inlining and exposed the 10-year bug.
Save and restore caller-saved XMM registers (all) as well.
Currently the bug manifests as e.g. frexp interceptor messes the
return value and the added test fails with:
i=8177 y=0.000000 exp=4
Reviewed By: melver
Differential Revision: https://reviews.llvm.org/D113742
21 lines
412 B
C++
21 lines
412 B
C++
// RUN: %clangxx -O2 %s -o %t && %run %t 2>&1 | FileCheck %s
|
|
|
|
#include <math.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
|
|
int main() {
|
|
for (int i = 0; i < 10000; i++) {
|
|
volatile double x = 10;
|
|
int exp = 0;
|
|
double y = frexp(x, &exp);
|
|
if (y != 0.625 || exp != 4) {
|
|
printf("i=%d y=%lf exp=%d\n", i, y, exp);
|
|
exit(1);
|
|
}
|
|
}
|
|
fprintf(stderr, "DONE\n");
|
|
// CHECK: DONE
|
|
return 0;
|
|
}
|