diff options
author | Mehdi Amini <mehdi.amini@apple.com> | 2016-12-15 18:54:00 +0000 |
---|---|---|
committer | Mehdi Amini <mehdi.amini@apple.com> | 2016-12-15 18:54:00 +0000 |
commit | 9f10f34a6b37ace77e86363c24dac140212371bd (patch) | |
tree | 5eeabc3c5c34d428ebb4aed088412629b7c4dcc3 /clang/test/CodeGen/builtins.c | |
parent | 9a038c188c55d99bbd7b5c7aee0d3246395164a5 (diff) | |
download | bcm5719-llvm-9f10f34a6b37ace77e86363c24dac140212371bd.tar.gz bcm5719-llvm-9f10f34a6b37ace77e86363c24dac140212371bd.zip |
Fix printf specifier handling: invalid specifier should not be marked as "consuming data arguments"
Reviewers: rsmith, bruno, dexonsmith
Subscribers: cfe-commits
Differential Revision: https://reviews.llvm.org/D27796
llvm-svn: 289850
Diffstat (limited to 'clang/test/CodeGen/builtins.c')
-rw-r--r-- | clang/test/CodeGen/builtins.c | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/clang/test/CodeGen/builtins.c b/clang/test/CodeGen/builtins.c index a0f846b14f1..390c2e35bf9 100644 --- a/clang/test/CodeGen/builtins.c +++ b/clang/test/CodeGen/builtins.c @@ -538,6 +538,34 @@ void test_builtin_os_log_precision_width(void *buf, const char *data, __builtin_os_log_format(buf, "Hello %*.*s World", precision, width, data); } +// CHECK-LABEL: define void @test_builtin_os_log_invalid +// CHECK: (i8* [[BUF:%.*]], i32 [[DATA:%.*]]) +void test_builtin_os_log_invalid(void *buf, int data) { + volatile int len; + // CHECK: store i8* [[BUF]], i8** [[BUF_ADDR:%.*]], align 8 + // CHECK: store i32 [[DATA]], i32* [[DATA_ADDR:%.*]] + + // CHECK: store volatile i32 8, + len = __builtin_os_log_format_buffer_size("invalid specifier %: %d even a trailing one%", data); + + // CHECK: [[BUF2:%.*]] = load i8*, i8** [[BUF_ADDR]] + // CHECK: [[SUMMARY:%.*]] = getelementptr i8, i8* [[BUF2]], i64 0 + // CHECK: store i8 0, i8* [[SUMMARY]] + // CHECK: [[NUM_ARGS:%.*]] = getelementptr i8, i8* [[BUF2]], i64 1 + // CHECK: store i8 1, i8* [[NUM_ARGS]] + + // CHECK: [[ARG1_DESC:%.*]] = getelementptr i8, i8* [[BUF2]], i64 2 + // CHECK: store i8 0, i8* [[ARG1_DESC]] + // CHECK: [[ARG1_SIZE:%.*]] = getelementptr i8, i8* [[BUF2]], i64 3 + // CHECK: store i8 4, i8* [[ARG1_SIZE]] + // CHECK: [[ARG1:%.*]] = getelementptr i8, i8* [[BUF2]], i64 4 + // CHECK: [[ARG1_INT:%.*]] = bitcast i8* [[ARG1]] to i32* + // CHECK: [[ARG1_VAL:%.*]] = load i32, i32* [[DATA_ADDR]] + // CHECK: store i32 [[ARG1_VAL]], i32* [[ARG1_INT]] + + __builtin_os_log_format(buf, "invalid specifier %: %d even a trailing one%", data); +} + // CHECK-LABEL: define void @test_builtin_os_log_percent // CHECK: (i8* [[BUF:%.*]], i8* [[DATA1:%.*]], i8* [[DATA2:%.*]]) // Check that the %% which does not consume any argument is correctly handled |