Skip to content

Commit

Permalink
[Analysis] Only use _unlocked stdio functions on linux
Browse files Browse the repository at this point in the history
The existing comment said that the functions were available only
on GNU/Linux (and on certain Android versions), but only checked
T.isGNUEnvironment() which also is true on MinGW (for arch-windows-gnu
triplets), which doesn't have such functions.

Existing checks in the initialize function in TargetLibraryInfo.cpp
also use only T.isOSLinux() to check for glibc features.

This fixes use of stdio on MinGW.

Differential Revision: https://reviews.llvm.org/D47002

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@332581 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
mstorsjo committed May 17, 2018
1 parent 9bb99f8 commit a925a3b
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 1 deletion.
3 changes: 2 additions & 1 deletion lib/Analysis/TargetLibraryInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -482,7 +482,8 @@ static void initialize(TargetLibraryInfoImpl &TLI, const Triple &T,
TLI.setUnavailable(LibFunc_sinhl_finite);
}

if (T.isGNUEnvironment() || (T.isAndroid() && !T.isAndroidVersionLT(28))) {
if ((T.isOSLinux() && T.isGNUEnvironment()) ||
(T.isAndroid() && !T.isAndroidVersionLT(28))) {
// available IO unlocked variants on GNU/Linux and Android P or later
TLI.setAvailable(LibFunc_getc_unlocked);
TLI.setAvailable(LibFunc_getchar_unlocked);
Expand Down
23 changes: 23 additions & 0 deletions test/Transforms/InstCombine/unlocked-stdio-mingw.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
; RUN: opt < %s -instcombine -S -mtriple=x86_64-w64-mingw32 | FileCheck %s

%struct._iobuf = type { i8*, i32, i8*, i32, i32, i32, i32, i8* }

@.str = private unnamed_addr constant [5 x i8] c"file\00", align 1
@.str.1 = private unnamed_addr constant [2 x i8] c"w\00", align 1

; Check that this still uses the plain fputc instead of fputc_unlocked
; for MinGW targets.
define void @external_fputc_test() {
; CHECK-LABEL: @external_fputc_test(
; CHECK-NEXT: [[CALL:%.*]] = call %struct._iobuf* @fopen(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str, i64 0, i64 0), i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.1, i64 0, i64 0))
; CHECK-NEXT: [[CALL1:%.*]] = call i32 @fputc(i32 99, %struct._iobuf* [[CALL]])
; CHECK-NEXT: ret void
;
%call = call %struct._iobuf* @fopen(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str, i64 0, i64 0), i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.1, i64 0, i64 0))
%call1 = call i32 @fputc(i32 99, %struct._iobuf* %call)
ret void
}

declare %struct._iobuf* @fopen(i8*, i8*)
declare i32 @fputc(i32, %struct._iobuf* nocapture)

0 comments on commit a925a3b

Please sign in to comment.