diff options
Diffstat (limited to 'src/grt')
-rw-r--r-- | src/grt/Makefile.inc | 9 | ||||
-rw-r--r-- | src/grt/config/chkstk-x64.S | 49 |
2 files changed, 58 insertions, 0 deletions
diff --git a/src/grt/Makefile.inc b/src/grt/Makefile.inc index 2df32ec08..71c202e11 100644 --- a/src/grt/Makefile.inc +++ b/src/grt/Makefile.inc @@ -61,6 +61,12 @@ ifeq ($(filter-out mingw32 mingw64 windows,$(osys)),) GRT_EXTRA_LIB=-ldbghelp GRT_EXEC_OPTS= GRT_SHARED_OPTS=-Wl,-u,_ghdl_main + + ifeq ($(filter-out x86_64,$(arch)),) + GRT_TARGET_OBJS+=chkstk-x64.o + else + GRT_TARGET_OBJS+=chkstk.o + endif else # For unix variants. # Usually needs -dl (for dlopen) and -lm (for math functions). @@ -232,6 +238,9 @@ pic/fastlz.o: $(GRTSRCDIR)/fst/fastlz.c chkstk.o: $(GRTSRCDIR)/config/chkstk.S $(GRT_C_COMPILE) +chkstk-x64.o: $(GRTSRCDIR)/config/chkstk-x64.S + $(GRT_C_COMPILE) + grt-backtraces-impl.ads: ifneq ($(GRT_LIBBACKTRACE),) echo "with Grt.Backtraces.Gcc;" > $@ diff --git a/src/grt/config/chkstk-x64.S b/src/grt/config/chkstk-x64.S new file mode 100644 index 000000000..e19c20786 --- /dev/null +++ b/src/grt/config/chkstk-x64.S @@ -0,0 +1,49 @@ +/* GRT stack implementation for x86. + Copyright (C) 2002 - 2014 Tristan Gingold. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <gnu.org/licenses>. + + As a special exception, if other files instantiate generics from this + unit, or you link this unit with other files to produce an executable, + this unit does not by itself cause the resulting executable to be + covered by the GNU General Public License. This exception does not + however invalidate any other reasons why the executable file might be + covered by the GNU Public License. +*/ + .file "chkstk-x64.S" + + .text + +/* Check stack for alloca: probe every page. + Argument is %rax (amount of bytes to be allocated) + *No* registers are clobbered. */ + + .align 4 + .globl __chkstk_ms +__chkstk_ms: + push %rcx + push %rax + cmp $0x1000,%rax + lea 0x18(%rsp),%rcx + jb 1f +0: sub $0x1000,%rcx + orq $0x0,(%rcx) + sub $0x1000,%rax + cmp $0x1000,%rax + ja 0b +1: sub %rax,%rcx + orq $0x0,(%rcx) + pop %rax + pop %rcx + ret |