diff options
| author | Daniel Dunbar <daniel@zuster.org> | 2009-02-10 00:06:49 +0000 |
|---|---|---|
| committer | Daniel Dunbar <daniel@zuster.org> | 2009-02-10 00:06:49 +0000 |
| commit | d5f1f55e288eae1dbc97aba37752b3ae01224132 (patch) | |
| tree | 813292fe4d52c214c8a84dd3041776c000e83bf8 | |
| parent | e5ade4a9a129dfe871e2236dcc8fbca60e870866 (diff) | |
| download | bcm5719-llvm-d5f1f55e288eae1dbc97aba37752b3ae01224132.tar.gz bcm5719-llvm-d5f1f55e288eae1dbc97aba37752b3ae01224132.zip | |
Make sure to initialize local variables, even if they were ignored by
ABI.
llvm-svn: 64187
| -rw-r--r-- | clang/lib/CodeGen/CGCall.cpp | 7 | ||||
| -rw-r--r-- | clang/test/CodeGen/parameter-passing.c | 15 |
2 files changed, 21 insertions, 1 deletions
diff --git a/clang/lib/CodeGen/CGCall.cpp b/clang/lib/CodeGen/CGCall.cpp index fbc421cb9e6..f90d31cd0b0 100644 --- a/clang/lib/CodeGen/CGCall.cpp +++ b/clang/lib/CodeGen/CGCall.cpp @@ -1266,6 +1266,13 @@ void CodeGenFunction::EmitFunctionProlog(const CGFunctionInfo &FI, } case ABIArgInfo::Ignore: + // Initialize the local variable appropriately. + if (hasAggregateLLVMType(Ty)) { + EmitParmDecl(*Arg, CreateTempAlloca(ConvertType(Ty))); + } else { + EmitParmDecl(*Arg, llvm::UndefValue::get(ConvertType(Arg->getType()))); + } + // Skip increment, no matching LLVM parameter. continue; diff --git a/clang/test/CodeGen/parameter-passing.c b/clang/test/CodeGen/parameter-passing.c index 637a2de42c8..5cc5e4797ca 100644 --- a/clang/test/CodeGen/parameter-passing.c +++ b/clang/test/CodeGen/parameter-passing.c @@ -1,6 +1,9 @@ // Check the various ways in which the three classes of values // (scalar, complex, aggregate) interact with parameter passing // (function entry, function return, call argument, call result). +// +// We also check _Bool and empty structures, as these can have annoying +// corner cases. // RUN: clang %s -triple i386-unknown-unknown -O3 -emit-llvm -o %t && // RUN: not grep '@g0' %t && @@ -13,18 +16,26 @@ // RUN: not grep '@g0' %t && // RUN: true +typedef _Bool BoolTy; typedef int ScalarTy; typedef _Complex int ComplexTy; typedef struct { int a, b, c; } AggrTy; +typedef struct { int a[0]; } EmptyTy; static int result; +static BoolTy bool_id(BoolTy a) { return a; } static AggrTy aggr_id(AggrTy a) { return a; } +static EmptyTy empty_id(EmptyTy a) { return a; } static ScalarTy scalar_id(ScalarTy a) { return a; } static ComplexTy complex_id(ComplexTy a) { return a; } +static void bool_mul(BoolTy a) { result *= a; } + static void aggr_mul(AggrTy a) { result *= a.a * a.b * a.c; } +static void empty_mul(EmptyTy a) { result *= 53; } + static void scalar_mul(ScalarTy a) { result *= a; } static void complex_mul(ComplexTy a) { result *= __real a * __imag a; } @@ -34,12 +45,14 @@ extern void g0(void); void f0(void) { result = 1; + bool_mul(bool_id(1)); aggr_mul(aggr_id((AggrTy) { 2, 3, 5})); + empty_mul(empty_id((EmptyTy) {})); scalar_mul(scalar_id(7)); complex_mul(complex_id(11 + 13i)); // This call should be eliminated. - if (result != 30030) + if (result != 2 * 3 * 5 * 7 * 11 * 13 * 53) g0(); } |

