diff options
author | Ben Gamari <bgamari.foss@gmail.com> | 2018-06-16 11:34:28 -0400 |
---|---|---|
committer | Ben Gamari <ben@smart-cactus.org> | 2018-06-16 12:35:30 -0400 |
commit | 86210b238b86d810874a2315d1715546a4006cea (patch) | |
tree | 42346a86d3c9b49ff3b380dca7a3a0b14d78044d /rts/StgCRun.c | |
parent | 1f2ed994de558924e3acb7578b1dca2ee52f5b14 (diff) | |
download | haskell-86210b238b86d810874a2315d1715546a4006cea.tar.gz |
rts: Use .cfi_{start|end}proc directives
Test Plan: Validate using LLVM assembler
Reviewers: carter, erikd, simonmar
Reviewed By: simonmar
Subscribers: rwbarton, thomie
GHC Trac Issues: #15207
Differential Revision: https://phabricator.haskell.org/D4781
Diffstat (limited to 'rts/StgCRun.c')
-rw-r--r-- | rts/StgCRun.c | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/rts/StgCRun.c b/rts/StgCRun.c index 92b0696c2b..8fea23d8dc 100644 --- a/rts/StgCRun.c +++ b/rts/StgCRun.c @@ -363,6 +363,15 @@ saved on the stack by the call instruction. Then we perform regular Haskell stack unwinding. */ +/* + * gcc automatically inserts .cfi_startproc/.cfi_endproc directives around + * inline assembler but clang does not. This caused the build to fail with + * Clang (see #15207). + */ + +#if defined(__clang__) +#define NEED_EXPLICIT_CFI_START_END +#endif static void GNUC3_ATTRIBUTE(used) StgRunIsImplementedInAssembler(void) @@ -376,6 +385,10 @@ StgRunIsImplementedInAssembler(void) STG_HIDDEN STG_RUN "\n" #endif STG_RUN ":\n\t" + +#if defined(NEED_EXPLICIT_CFI_START_END) + ".cfi_startproc simple\n\t" +#endif "subq %1, %%rsp\n\t" "movq %%rsp, %%rax\n\t" "subq %0, %%rsp\n\t" @@ -462,6 +475,10 @@ StgRunIsImplementedInAssembler(void) #if !defined(mingw32_HOST_OS) STG_HIDDEN xstr(STG_RUN_JMP) "\n" #endif +#if defined(NEED_EXPLICIT_CFI_START_END) + ".cfi_endproc\n\t" +#endif + #if HAVE_SUBSECTIONS_VIA_SYMBOLS // If we have deadstripping enabled and a label is detected as unused // the code gets nop'd out. @@ -500,7 +517,7 @@ StgRunIsImplementedInAssembler(void) "movq 136(%%rax),%%xmm15\n\t" #endif "addq %1, %%rsp\n\t" - "retq" + "retq\n\t" : : "i"(RESERVED_C_STACK_BYTES), |