Author: dblaikie Date: Thu Aug 1 15:57:40 2013 New Revision: 187611 URL: http://llvm.org/viewvc/llvm-project?rev=187611&view=rev Log: DebugInfo: Don't prefer declarations over definitions in -flimit-debug-info in C
Without an ODR, the -flimit-debug-info debug info size optimization of emitting declarations for fully defined types when only a declaration is needed by the TU, is incorrect. Emit the full definition whenever it's available in non-C++. Added: cfe/trunk/test/CodeGen/debug-info-limited.c Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.cpp cfe/trunk/test/CodeGenCXX/debug-info-limited.cpp Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.cpp?rev=187611&r1=187610&r2=187611&view=diff ============================================================================== --- cfe/trunk/lib/CodeGen/CGDebugInfo.cpp (original) +++ cfe/trunk/lib/CodeGen/CGDebugInfo.cpp Thu Aug 1 15:57:40 2013 @@ -1422,7 +1422,7 @@ llvm::DIType CGDebugInfo::CreateType(con // Limited debug info should only remove struct definitions that can // safely be replaced by a forward declaration in the source code. if (DebugKind <= CodeGenOptions::LimitedDebugInfo && Declaration && - !RD->isCompleteDefinitionRequired()) { + !RD->isCompleteDefinitionRequired() && CGM.getLangOpts().CPlusPlus) { // FIXME: This implementation is problematic; there are some test // cases where we violate the above principle, such as // test/CodeGen/debug-info-records.c . @@ -1951,7 +1951,8 @@ llvm::DIType CGDebugInfo::getCompletedTy void CGDebugInfo::completeFwdDecl(const RecordDecl &RD) { // In limited debug info we only want to do this if the complete type was // required. - if (DebugKind <= CodeGenOptions::LimitedDebugInfo) + if (DebugKind <= CodeGenOptions::LimitedDebugInfo && + CGM.getLangOpts().CPlusPlus) return; QualType QTy = CGM.getContext().getRecordType(&RD); Added: cfe/trunk/test/CodeGen/debug-info-limited.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/debug-info-limited.c?rev=187611&view=auto ============================================================================== --- cfe/trunk/test/CodeGen/debug-info-limited.c (added) +++ cfe/trunk/test/CodeGen/debug-info-limited.c Thu Aug 1 15:57:40 2013 @@ -0,0 +1,11 @@ +// RUN: %clang -flimit-debug-info -emit-llvm -g -S %s -o - | FileCheck %s + +// Ensure we emit the full definition of 'foo' even though only its declaration +// is needed, since C has no ODR to ensure that the definition will be the same +// in whatever TU actually uses/requires the definition of 'foo'. +// CHECK: ; [ DW_TAG_structure_type ] [foo] {{.*}} [def] + +struct foo { +}; + +struct foo *f; Modified: cfe/trunk/test/CodeGenCXX/debug-info-limited.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info-limited.cpp?rev=187611&r1=187610&r2=187611&view=diff ============================================================================== --- cfe/trunk/test/CodeGenCXX/debug-info-limited.cpp (original) +++ cfe/trunk/test/CodeGenCXX/debug-info-limited.cpp Thu Aug 1 15:57:40 2013 @@ -1,7 +1,6 @@ -// RUN: %clang -emit-llvm -g -S %s -o - | FileCheck %s +// RUN: %clang -flimit-debug-info -emit-llvm -g -S %s -o - | FileCheck %s -// TAG_member is used to encode debug info for 'z' in A. -// CHECK: TAG_member +// CHECK: ; [ DW_TAG_class_type ] [A] {{.*}} [def] class A { public: int z; @@ -13,8 +12,7 @@ A *foo (A* x) { } // Verify that we're not emitting a full definition of B in limit debug mode. -// RUN: %clang -emit-llvm -g -flimit-debug-info -S %s -o - | FileCheck %s -// CHECK-NOT: TAG_member +// CHECK: ; [ DW_TAG_class_type ] [B] {{.*}} [decl] class B { public: _______________________________________________ cfe-commits mailing list cfe-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits