Path: blob/main/contrib/llvm-project/compiler-rt/lib/tsan/rtl/tsan_rtl_amd64.S
35269 views
// The content of this file is x86_64-only:1#if defined(__x86_64__)23#include "sanitizer_common/sanitizer_asm.h"45#if !defined(__APPLE__)6.section .text7#else8.section __TEXT,__text9#endif1011ASM_HIDDEN(__tsan_setjmp)12#if defined(__NetBSD__)13.comm _ZN14__interception15real___setjmp14E,8,814#elif !defined(__APPLE__)15.comm _ZN14__interception11real_setjmpE,8,816#endif17#if defined(__NetBSD__)18.globl ASM_SYMBOL_INTERCEPTOR(__setjmp14)19ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(__setjmp14))20ASM_SYMBOL_INTERCEPTOR(__setjmp14):21#else22.globl ASM_SYMBOL_INTERCEPTOR(setjmp)23ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(setjmp))24ASM_SYMBOL_INTERCEPTOR(setjmp):25#endif26CFI_STARTPROC27_CET_ENDBR28// save env parameter29push %rdi30CFI_ADJUST_CFA_OFFSET(8)31CFI_REL_OFFSET(%rdi, 0)32// obtain SP, store in %rdi, first argument to `void __tsan_setjmp(uptr sp)`33#if defined(__FreeBSD__) || defined(__NetBSD__)34lea 8(%rsp), %rdi35#elif defined(__linux__) || defined(__APPLE__)36lea 16(%rsp), %rdi37#else38# error "Unknown platform"39#endif40// call tsan interceptor41call ASM_SYMBOL(__tsan_setjmp)42// restore env parameter43pop %rdi44CFI_ADJUST_CFA_OFFSET(-8)45CFI_RESTORE(%rdi)46// tail jump to libc setjmp47movl $0, %eax48#if defined(__NetBSD__)49movq _ZN14__interception15real___setjmp14E@GOTPCREL(%rip), %rdx50jmp *(%rdx)51#elif !defined(__APPLE__)52movq _ZN14__interception11real_setjmpE@GOTPCREL(%rip), %rdx53jmp *(%rdx)54#else55jmp ASM_SYMBOL(setjmp)56#endif57CFI_ENDPROC58#if defined(__NetBSD__)59ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(__setjmp14))60#else61ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(setjmp))62#endif6364.comm _ZN14__interception12real__setjmpE,8,865.globl ASM_SYMBOL_INTERCEPTOR(_setjmp)66ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(_setjmp))67ASM_SYMBOL_INTERCEPTOR(_setjmp):68CFI_STARTPROC69_CET_ENDBR70// save env parameter71push %rdi72CFI_ADJUST_CFA_OFFSET(8)73CFI_REL_OFFSET(%rdi, 0)74// obtain SP, store in %rdi, first argument to `void __tsan_setjmp(uptr sp)`75#if defined(__FreeBSD__) || defined(__NetBSD__)76lea 8(%rsp), %rdi77#elif defined(__linux__) || defined(__APPLE__)78lea 16(%rsp), %rdi79#else80# error "Unknown platform"81#endif82// call tsan interceptor83call ASM_SYMBOL(__tsan_setjmp)84// restore env parameter85pop %rdi86CFI_ADJUST_CFA_OFFSET(-8)87CFI_RESTORE(%rdi)88// tail jump to libc setjmp89movl $0, %eax90#if !defined(__APPLE__)91movq _ZN14__interception12real__setjmpE@GOTPCREL(%rip), %rdx92jmp *(%rdx)93#else94jmp ASM_SYMBOL(_setjmp)95#endif96CFI_ENDPROC97ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(_setjmp))9899#if defined(__NetBSD__)100.comm _ZN14__interception18real___sigsetjmp14E,8,8101.globl ASM_SYMBOL_INTERCEPTOR(__sigsetjmp14)102ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(__sigsetjmp14))103ASM_SYMBOL_INTERCEPTOR(__sigsetjmp14):104#else105.comm _ZN14__interception14real_sigsetjmpE,8,8106.globl ASM_SYMBOL_INTERCEPTOR(sigsetjmp)107ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(sigsetjmp))108ASM_SYMBOL_INTERCEPTOR(sigsetjmp):109#endif110CFI_STARTPROC111_CET_ENDBR112// save env parameter113push %rdi114CFI_ADJUST_CFA_OFFSET(8)115CFI_REL_OFFSET(%rdi, 0)116// save savesigs parameter117push %rsi118CFI_ADJUST_CFA_OFFSET(8)119CFI_REL_OFFSET(%rsi, 0)120// align stack frame121sub $8, %rsp122CFI_ADJUST_CFA_OFFSET(8)123// obtain SP, store in %rdi, first argument to `void __tsan_setjmp(uptr sp)`124#if defined(__FreeBSD__) || defined(__NetBSD__)125lea 24(%rsp), %rdi126#elif defined(__linux__) || defined(__APPLE__)127lea 32(%rsp), %rdi128#else129# error "Unknown platform"130#endif131// call tsan interceptor132call ASM_SYMBOL(__tsan_setjmp)133// unalign stack frame134add $8, %rsp135CFI_ADJUST_CFA_OFFSET(-8)136// restore savesigs parameter137pop %rsi138CFI_ADJUST_CFA_OFFSET(-8)139CFI_RESTORE(%rsi)140// restore env parameter141pop %rdi142CFI_ADJUST_CFA_OFFSET(-8)143CFI_RESTORE(%rdi)144// tail jump to libc sigsetjmp145movl $0, %eax146#if defined(__NetBSD__)147movq _ZN14__interception18real___sigsetjmp14E@GOTPCREL(%rip), %rdx148jmp *(%rdx)149#elif !defined(__APPLE__)150movq _ZN14__interception14real_sigsetjmpE@GOTPCREL(%rip), %rdx151jmp *(%rdx)152#else153jmp ASM_SYMBOL(sigsetjmp)154#endif155CFI_ENDPROC156#if defined(__NetBSD__)157ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(__sigsetjmp14))158#else159ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(sigsetjmp))160#endif161162#if !defined(__APPLE__) && !defined(__NetBSD__)163.comm _ZN14__interception16real___sigsetjmpE,8,8164.globl ASM_SYMBOL_INTERCEPTOR(__sigsetjmp)165ASM_TYPE_FUNCTION(ASM_SYMBOL_INTERCEPTOR(__sigsetjmp))166ASM_SYMBOL_INTERCEPTOR(__sigsetjmp):167CFI_STARTPROC168_CET_ENDBR169// save env parameter170push %rdi171CFI_ADJUST_CFA_OFFSET(8)172CFI_REL_OFFSET(%rdi, 0)173// save savesigs parameter174push %rsi175CFI_ADJUST_CFA_OFFSET(8)176CFI_REL_OFFSET(%rsi, 0)177// align stack frame178sub $8, %rsp179CFI_ADJUST_CFA_OFFSET(8)180// obtain SP, store in %rdi, first argument to `void __tsan_setjmp(uptr sp)`181#if defined(__FreeBSD__)182lea 24(%rsp), %rdi183#else184lea 32(%rsp), %rdi185#endif186// call tsan interceptor187call ASM_SYMBOL(__tsan_setjmp)188// unalign stack frame189add $8, %rsp190CFI_ADJUST_CFA_OFFSET(-8)191// restore savesigs parameter192pop %rsi193CFI_ADJUST_CFA_OFFSET(-8)194CFI_RESTORE(%rsi)195// restore env parameter196pop %rdi197CFI_ADJUST_CFA_OFFSET(-8)198CFI_RESTORE(%rdi)199// tail jump to libc sigsetjmp200movl $0, %eax201movq _ZN14__interception16real___sigsetjmpE@GOTPCREL(%rip), %rdx202jmp *(%rdx)203CFI_ENDPROC204ASM_SIZE(ASM_SYMBOL_INTERCEPTOR(__sigsetjmp))205#endif // !defined(__APPLE__) && !defined(__NetBSD__)206207NO_EXEC_STACK_DIRECTIVE208209#endif210211212