| ; Verify that calls to known stdio library functions declared with |
| ; incompatible signatures are handled gracefully and without aborting. |
| ; |
| ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py |
| ; RUN: opt < %s -passes=instcombine -S | FileCheck %s |
| |
| declare i32 @fwrite(ptr, i64, i64, ptr) |
| declare i8 @fputc(ptr, ptr) |
| |
| declare void @printf(ptr) |
| declare i8 @fprintf(ptr, ptr) |
| declare i8 @sprintf(ptr, ptr) |
| |
| |
| @ca1 = constant [1 x i8] c"1" |
| @pcnt_s = constant [3 x i8] c"%s\00" |
| |
| |
| ; Verify that a call to fwrite isn't transformed into one to fputc when |
| ; the latter is declared with an incompatible signature (which might |
| ; trigger an abort). |
| |
| define void @call_fwrite(ptr %fp) { |
| call i32 @fwrite(ptr @ca1, i64 1, i64 1, ptr %fp) |
| ret void |
| } |
| |
| |
| ; Verify that a call to an incompatible void printf(char*) with just "%s" |
| ; isn't transformed. |
| |
| define void @call_printf(ptr %s) { |
| ; CHECK-LABEL: @call_printf( |
| ; |
| call i32 @printf(ptr @pcnt_s) |
| ret void |
| } |
| |
| ; Verify that a call to an incompatible int fprintf(FILE*, char*) isn't |
| ; transformed. |
| |
| define i8 @call_fprintf(ptr %fp, ptr %p) { |
| ; CHECK-LABEL: @call_fprintf( |
| ; |
| %call = call i8 (ptr, ptr, ...) @fprintf(ptr %fp, ptr @pcnt_s, ptr %p) |
| ret i8 %call |
| } |
| |
| ; Verify that a call to an incompatible int sprintf(FILE*, char*) isn't |
| ; transformed. |
| |
| define i8 @call_sprintf(ptr %p, ptr %q) { |
| ; CHECK-LABEL: @call_sprintf( |
| ; |
| %call = call i8 (ptr, ptr, ...) @sprintf(ptr %p, ptr @pcnt_s, ptr %q) |
| ret i8 %call |
| } |
| |