Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 54fd506

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 2654c30 commit 54fd506

17 files changed

+60
-5
lines changed

compiler-rt/lib/builtins/CMakeLists.txt

+11-5
Original file line numberDiff line numberDiff line change
@@ -309,7 +309,7 @@ set(x86_80_BIT_SOURCES
309309
trunctfxf2.c
310310
)
311311

312-
if (NOT MSVC)
312+
if (NOT CMAKE_ASM_COMPILER_ID MATCHES "MSVC")
313313
set(x86_64_SOURCES
314314
${GENERIC_SOURCES}
315315
${GENERIC_TF_SOURCES}
@@ -325,7 +325,7 @@ if (NOT MSVC)
325325
)
326326
endif()
327327

328-
if (NOT ANDROID)
328+
if (NOT ANDROID AND NOT MSVC)
329329
set(x86_64_SOURCES
330330
${x86_64_SOURCES}
331331
${x86_80_BIT_SOURCES}
@@ -366,7 +366,7 @@ if (NOT MSVC)
366366
i386/umoddi3.S
367367
)
368368

369-
if (NOT ANDROID)
369+
if (NOT ANDROID AND NOT MSVC)
370370
set(i386_SOURCES
371371
${i386_SOURCES}
372372
${x86_80_BIT_SOURCES}
@@ -381,7 +381,7 @@ if (NOT MSVC)
381381
i386/chkstk.S
382382
)
383383
endif()
384-
else () # MSVC
384+
else () # MSVC assembler
385385
# Use C versions of functions when building on MSVC
386386
# MSVC's assembler takes Intel syntax, not AT&T syntax.
387387
# Also use only MSVC compilable builtin implementations.
@@ -392,7 +392,13 @@ else () # MSVC
392392
x86_64/floatdisf.c
393393
)
394394
set(i386_SOURCES ${GENERIC_SOURCES} ${x86_ARCH_SOURCES})
395-
endif () # if (NOT MSVC)
395+
endif ()
396+
397+
if (MSVC)
398+
set_source_files_properties(
399+
${x86_64_SOURCES} ${i386_SOURCES}
400+
PROPERTIES COMPILE_FLAGS "/GS- /Zl")
401+
endif()
396402

397403

398404
# builtin support for Targets that have Arm state or have Thumb2

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

+3
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

+3
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

+2
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
push %ecx

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

+2
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

+2
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 __floatdidf(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

+2
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

+2
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
// xf_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

+2
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

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

+3
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 __floatundisf(du_int a);
89

@@ -28,6 +29,7 @@ twop64: .quad 0x0000000000000000
2829
#define TWOp64 twop64-0b(%ecx,%eax,8)
2930
3031
.text
32+
WIN32_SAFE_SEH_HEADER
3133
.balign 4
3234
DEFINE_COMPILERRT_FUNCTION(__floatundisf)
3335
movl 8(%esp), %eax
@@ -73,6 +75,7 @@ twelve:
7375
#define STICKY sticky-0b(%ecx,%eax,8)
7476

7577
.text
78+
WIN32_SAFE_SEH_HEADER
7679
.balign 4
7780
DEFINE_COMPILERRT_FUNCTION(__floatundisf)
7881
movl 8(%esp), %eax

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

+2
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
// xf_float __floatundixf(du_int a);16
89

@@ -25,6 +26,7 @@ twop84:
2526
#define REL_ADDR(_a) (_a)-0b(%eax)
2627

2728
.text
29+
WIN32_SAFE_SEH_HEADER
2830
.balign 4
2931
DEFINE_COMPILERRT_FUNCTION(__floatundixf)
3032
calll 0f

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

+3
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 __lshrdi3(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(__lshrdi3)
2224
movd 12(%esp), %xmm2 // Load count
@@ -37,6 +39,7 @@ END_COMPILERRT_FUNCTION(__lshrdi3)
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(__lshrdi3)
4245
movl 12(%esp), %ecx // Load count

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

+2
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 __moddi3(di_int a, di_int b);
89

@@ -21,6 +22,7 @@
2122
#ifdef __i386__
2223

2324
.text
25+
WIN32_SAFE_SEH_HEADER
2426
.balign 4
2527
DEFINE_COMPILERRT_FUNCTION(__moddi3)
2628

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

+2
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,14 @@
33
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
44

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

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

910
#ifdef __i386__
1011

1112
.text
13+
WIN32_SAFE_SEH_HEADER
1214
.balign 4
1315
DEFINE_COMPILERRT_FUNCTION(__muldi3)
1416
pushl %ebx
+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
#ifdef _MSC_VER
2+
3+
#define WIN32_SAFE_SEH_HEADER \
4+
.def @feat.00; \
5+
.scl 3; \
6+
.type 0; \
7+
.endef; \
8+
.globl @feat.00; \
9+
.set @feat.00, 1;
10+
11+
#else
12+
13+
#define WIN32_SAFE_SEH_HEADER
14+
15+
#endif

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

+2
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
// du_int __udivdi3(du_int a, du_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(__udivdi3)
2527

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

+2
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
// du_int __umoddi3(du_int a, du_int b);
89

@@ -21,6 +22,7 @@
2122
#ifdef __i386__
2223

2324
.text
25+
WIN32_SAFE_SEH_HEADER
2426
.balign 4
2527
DEFINE_COMPILERRT_FUNCTION(__umoddi3)
2628

0 commit comments

Comments
 (0)