From ec6a6a6bb5bb30ca1821c9df312893ec9bd52d26 Mon Sep 17 00:00:00 2001 From: Tristan Gingold Date: Wed, 30 Mar 2022 08:14:09 +0200 Subject: Add chkstk-x64 for windows x64 --- Makefile.in | 6 ++--- src/grt/Makefile.inc | 9 +++++++ src/grt/config/chkstk-x64.S | 49 ++++++++++++++++++++++++++++++++++ src/ortho/mcode/ortho_code-x86-abi.adb | 14 ++++++++-- 4 files changed, 73 insertions(+), 5 deletions(-) create mode 100644 src/grt/config/chkstk-x64.S diff --git a/Makefile.in b/Makefile.in index 3cfd47994..efc29e6b7 100644 --- a/Makefile.in +++ b/Makefile.in @@ -205,8 +205,8 @@ GHDL_MCODE_INCFLAGS=$(GHDL_COMMON_INCFLAGS) -aI$(srcdir)/src/ghdldrv -aI$(srcdir ghdl_mcode$(EXEEXT): GRT_FLAGS+=-DWITH_GNAT_RUN_TIME ghdl_mcode$(EXEEXT): $(GRT_ADD_OBJS) $(GRT_SRC_DEPS) $(ORTHO_DEPS) \ - memsegs_c.o chkstk.o version.ads force - $(GNATMAKE) -o $@ -gnat12 $(GHDL_MCODE_INCFLAGS) $(GNATFLAGS) -gnatw.A ghdl_jit.adb $(GNAT_BARGS) -largs memsegs_c.o chkstk.o $(GRT_ADD_OBJS) $(LDFLAGS) $(subst @,$(GRTSRCDIR),$(GRT_EXTRA_LIB) $(GRT_EXEC_OPTS)) + memsegs_c.o version.ads force + $(GNATMAKE) -o $@ -gnat12 $(GHDL_MCODE_INCFLAGS) $(GNATFLAGS) -gnatw.A ghdl_jit.adb $(GNAT_BARGS) -largs memsegs_c.o $(GRT_ADD_OBJS) $(LDFLAGS) $(subst @,$(GRTSRCDIR),$(GRT_EXTRA_LIB) $(GRT_EXEC_OPTS)) memsegs_c.o: $(srcdir)/src/ortho/mcode/memsegs_c.c $(CC) -c $(COVERAGE_FLAGS) $(CFLAGS) -o $@ $< @@ -648,7 +648,7 @@ distclean: clean $(RM) -f Makefile config.status ghdl.gpr clean-c: force - $(RM) -f memsegs_c.o chkstk.o jumps.o times.o + $(RM) -f memsegs_c.o chkstk.o chkstk-x64.o jumps.o times.o $(RM) -f grt-cstdio.o grt-cgnatrts.o grt-modules.o $(RM) -f grt-cvpi.o grt-cvhpi.o grt-cdynload.o $(RM) -f fstapi.o fastlz.o lz4.o 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 . + + 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 diff --git a/src/ortho/mcode/ortho_code-x86-abi.adb b/src/ortho/mcode/ortho_code-x86-abi.adb index 44c435de2..0bba430a0 100644 --- a/src/ortho/mcode/ortho_code-x86-abi.adb +++ b/src/ortho/mcode/ortho_code-x86-abi.adb @@ -846,7 +846,12 @@ package body Ortho_Code.X86.Abi is procedure Chkstk (Sz : Integer); pragma Import (C, Chkstk, "__chkstk"); - procedure Link_Intrinsics is + procedure Chkstk_Ms (Sz : Integer); + pragma Import (C, Chkstk_Ms, "__chkstk_ms"); + + procedure Link_Intrinsics + is + Addr : System.Address; begin if not Flags.M64 then Binary_File.Memory.Set_Symbol_Address @@ -863,8 +868,13 @@ package body Ortho_Code.X86.Abi is Moddi3'Address); end if; if X86.Flags.Flag_Alloca_Call then + if Flags.Win64 then + Addr := Chkstk_Ms'Address; + else + Addr := Chkstk'Address; + end if; Binary_File.Memory.Set_Symbol_Address - (Ortho_Code.X86.Emits.Chkstk_Symbol, Chkstk'Address); + (Ortho_Code.X86.Emits.Chkstk_Symbol, Addr); end if; end Link_Intrinsics; -- cgit v1.2.3