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 --- src/grt/Makefile.inc | 9 +++++++ src/grt/config/chkstk-x64.S | 49 ++++++++++++++++++++++++++++++++++ src/ortho/mcode/ortho_code-x86-abi.adb | 14 ++++++++-- 3 files changed, 70 insertions(+), 2 deletions(-) create mode 100644 src/grt/config/chkstk-x64.S (limited to 'src') 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