Skip to content

Commit 8240252

Browse files
committed
[LDC] compiler-rt: Misc. fixes/tweaks for builtins lib on Windows
* Include ASM files when using MSVC-compatible clang-cl.exe as C compiler (and its assembler supporting AT&T syntax). * Disable buffer overflow checks to prevent dependencies on special MS C symbols. => /GS- * Use `/Zl` to prevent dragging in libcmt.lib. * Mark all i386 ASM files as SafeSEH-compatible on Win32.
1 parent 4a45a0b commit 8240252

File tree

18 files changed

+59
-3
lines changed

18 files changed

+59
-3
lines changed

compiler-rt/lib/builtins/CMakeLists.txt

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -248,7 +248,7 @@ if (NOT MSVC)
248248
)
249249
endif ()
250250

251-
if (NOT MSVC)
251+
if (NOT CMAKE_ASM_COMPILER_ID MATCHES "MSVC")
252252
set(x86_64_SOURCES
253253
${GENERIC_TF_SOURCES}
254254
x86_64/floatdidf.c
@@ -294,7 +294,7 @@ if (NOT MSVC)
294294
i386/chkstk2.S
295295
)
296296
endif()
297-
else () # MSVC
297+
else () # MSVC assembler
298298
# Use C versions of functions when building on MSVC
299299
# MSVC's assembler takes Intel syntax, not AT&T syntax.
300300
# Also use only MSVC compilable builtin implementations.
@@ -306,12 +306,17 @@ else () # MSVC
306306
)
307307
set(x86_64h_SOURCES ${x86_64_SOURCES})
308308
set(i386_SOURCES ${GENERIC_SOURCES})
309-
endif () # if (NOT MSVC)
309+
endif ()
310310

311311
set(x86_64h_SOURCES ${x86_64h_SOURCES} ${x86_ARCH_SOURCES})
312312
set(x86_64_SOURCES ${x86_64_SOURCES} ${x86_ARCH_SOURCES})
313313
set(i386_SOURCES ${i386_SOURCES} ${x86_ARCH_SOURCES})
314314
set(i686_SOURCES ${i686_SOURCES} ${x86_ARCH_SOURCES})
315+
if (MSVC)
316+
set_source_files_properties(
317+
${x86_64h_SOURCES} ${x86_64_SOURCES} ${i386_SOURCES} ${i686_SOURCES}
318+
PROPERTIES COMPILE_FLAGS "/GS- /Zl")
319+
endif()
315320

316321
set(arm_SOURCES
317322
arm/fp_mode.c

compiler-rt/lib/builtins/i386/ashldi3.S

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
44

55
#include "../assembly.h"
6+
#include "safeseh.h"
67

78
// di_int __ashldi3(di_int input, int count);
89

@@ -17,6 +18,7 @@
1718
#ifdef __SSE2__
1819

1920
.text
21+
WIN32_SAFE_SEH_HEADER
2022
.balign 4
2123
DEFINE_COMPILERRT_FUNCTION(__ashldi3)
2224
movd 12(%esp), %xmm2 // Load count
@@ -37,6 +39,7 @@ END_COMPILERRT_FUNCTION(__ashldi3)
3739
#else // Use GPRs instead of SSE2 instructions, if they aren't available.
3840

3941
.text
42+
WIN32_SAFE_SEH_HEADER
4043
.balign 4
4144
DEFINE_COMPILERRT_FUNCTION(__ashldi3)
4245
movl 12(%esp), %ecx // Load count

compiler-rt/lib/builtins/i386/ashrdi3.S

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,15 @@
33
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
44

55
#include "../assembly.h"
6+
#include "safeseh.h"
67

78
// di_int __ashrdi3(di_int input, int count);
89

910
#ifdef __i386__
1011
#ifdef __SSE2__
1112

1213
.text
14+
WIN32_SAFE_SEH_HEADER
1315
.balign 4
1416
DEFINE_COMPILERRT_FUNCTION(__ashrdi3)
1517
movd 12(%esp), %xmm2 // Load count
@@ -47,6 +49,7 @@ END_COMPILERRT_FUNCTION(__ashrdi3)
4749
#else // Use GPRs instead of SSE2 instructions, if they aren't available.
4850

4951
.text
52+
WIN32_SAFE_SEH_HEADER
5053
.balign 4
5154
DEFINE_COMPILERRT_FUNCTION(__ashrdi3)
5255
movl 12(%esp), %ecx // Load count

compiler-rt/lib/builtins/i386/chkstk.S

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
44

55
#include "../assembly.h"
6+
#include "safeseh.h"
67

78
// _chkstk routine
89
// This routine is windows specific
@@ -11,6 +12,7 @@
1112
#ifdef __i386__
1213

1314
.text
15+
WIN32_SAFE_SEH_HEADER
1416
.balign 4
1517
DEFINE_COMPILERRT_FUNCTION(__chkstk_ms)
1618
push %ecx

compiler-rt/lib/builtins/i386/chkstk2.S

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
44

55
#include "../assembly.h"
6+
#include "safeseh.h"
67

78
#ifdef __i386__
89

@@ -12,6 +13,7 @@
1213
// http://msdn.microsoft.com/en-us/library/ms648426.aspx
1314

1415
.text
16+
WIN32_SAFE_SEH_HEADER
1517
.balign 4
1618
DEFINE_COMPILERRT_FUNCTION(_alloca) // _chkstk and _alloca are the same function
1719
DEFINE_COMPILERRT_FUNCTION(__chkstk)

compiler-rt/lib/builtins/i386/divdi3.S

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
44

55
#include "../assembly.h"
6+
#include "safeseh.h"
67

78
// di_int __divdi3(di_int a, di_int b);
89

@@ -20,6 +21,7 @@
2021
#ifdef __i386__
2122

2223
.text
24+
WIN32_SAFE_SEH_HEADER
2325
.balign 4
2426
DEFINE_COMPILERRT_FUNCTION(__divdi3)
2527

compiler-rt/lib/builtins/i386/floatdidf.S

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
44

55
#include "../assembly.h"
6+
#include "safeseh.h"
67

78
// double __floatundidf(du_int a);
89

@@ -21,6 +22,7 @@ twop32:
2122
#define REL_ADDR(_a) (_a)-0b(%eax)
2223

2324
.text
25+
WIN32_SAFE_SEH_HEADER
2426
.balign 4
2527
DEFINE_COMPILERRT_FUNCTION(__floatdidf)
2628
cvtsi2sd 8(%esp), %xmm1

compiler-rt/lib/builtins/i386/floatdisf.S

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
44

55
#include "../assembly.h"
6+
#include "safeseh.h"
67

78
// float __floatdisf(di_int a);
89

@@ -16,6 +17,7 @@
1617
#ifdef __i386__
1718

1819
.text
20+
WIN32_SAFE_SEH_HEADER
1921
.balign 4
2022
DEFINE_COMPILERRT_FUNCTION(__floatdisf)
2123
#ifndef TRUST_CALLERS_USE_64_BIT_STORES

compiler-rt/lib/builtins/i386/floatdixf.S

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
44

55
#include "../assembly.h"
6+
#include "safeseh.h"
67

78
// float __floatdixf(di_int a);
89

@@ -16,6 +17,7 @@
1617
// It can be turned off by defining the TRUST_CALLERS_USE_64_BIT_STORES macro.
1718

1819
.text
20+
WIN32_SAFE_SEH_HEADER
1921
.balign 4
2022
DEFINE_COMPILERRT_FUNCTION(__floatdixf)
2123
#ifndef TRUST_CALLERS_USE_64_BIT_STORES

compiler-rt/lib/builtins/i386/floatundidf.S

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
//===----------------------------------------------------------------------===//
1212

1313
#include "../assembly.h"
14+
#include "safeseh.h"
1415

1516
// double __floatundidf(du_int a);
1617

@@ -33,6 +34,7 @@ twop84:
3334
#define REL_ADDR(_a) (_a)-0b(%eax)
3435

3536
.text
37+
WIN32_SAFE_SEH_HEADER
3638
.balign 4
3739
DEFINE_COMPILERRT_FUNCTION(__floatundidf)
3840
movss 8(%esp), %xmm1 // high 32 bits of a

0 commit comments

Comments
 (0)