Please verify.
This patch adds support for access modifiers for C++ member functions
(private/public) inside llvm IR and dwarf debug info. Test cases for
both llvm and clang are included. Generated against svn 116700.
Alex
Index: test/DebugInfo/memberaccess.ll
===================================================================
--- test/DebugInfo/memberaccess.ll (revision 0)
+++ test/DebugInfo/memberaccess.ll (revision 0)
@@ -0,0 +1,91 @@
+; RUN: llc -O0 < %s | grep DW_ACCESS_private
+
+target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
+target triple = "x86_64-unknown-linux-gnu"
+
+%class.SomeClass = type { i8 }
+
+...@sc = global %class.SomeClass zeroinitializer, align 1
+
+define i32 @main() {
+entry:
+ %retval = alloca i32, align 4
+ store i32 0, i32* %retval
+ call void @_ZN9SomeClass10Public_FunEv(%class.SomeClass* @sc), !dbg !22
+ %0 = load i32* %retval, !dbg !24
+ ret i32 %0, !dbg !24
+}
+
+define linkonce_odr void @_ZN9SomeClass10Public_FunEv(%class.SomeClass* %this) align 2 {
+entry:
+ %this.addr = alloca %class.SomeClass*, align 8
+ store %class.SomeClass* %this, %class.SomeClass** %this.addr, align 8
+ call void @llvm.dbg.declare(metadata !{%class.SomeClass** %this.addr}, metadata !25), !dbg !26
+ %this1 = load %class.SomeClass** %this.addr
+ call void @_ZN9SomeClass13Protected_FunEv(%class.SomeClass* %this1), !dbg !27
+ call void @_ZN9SomeClass11Private_FunEv(%class.SomeClass* %this1), !dbg !29
+ ret void, !dbg !30
+}
+
+declare void @llvm.dbg.declare(metadata, metadata) nounwind readnone
+
+define linkonce_odr void @_ZN9SomeClass13Protected_FunEv(%class.SomeClass* %this) nounwind align 2 {
+entry:
+ %this.addr = alloca %class.SomeClass*, align 8
+ store %class.SomeClass* %this, %class.SomeClass** %this.addr, align 8
+ call void @llvm.dbg.declare(metadata !{%class.SomeClass** %this.addr}, metadata !31), !dbg !32
+ %this1 = load %class.SomeClass** %this.addr
+ ret void, !dbg !33
+}
+
+define linkonce_odr void @_ZN9SomeClass11Private_FunEv(%class.SomeClass* %this) nounwind align 2 {
+entry:
+ %this.addr = alloca %class.SomeClass*, align 8
+ store %class.SomeClass* %this, %class.SomeClass** %this.addr, align 8
+ call void @llvm.dbg.declare(metadata !{%class.SomeClass** %this.addr}, metadata !35), !dbg !36
+ %this1 = load %class.SomeClass** %this.addr
+ ret void, !dbg !37
+}
+
+!llvm.dbg.sp = !{!0, !5, !9, !12, !16, !19, !20}
+!llvm.dbg.gv = !{!21}
+
+!0 = metadata !{i32 589870, i32 0, metadata !1, metadata !"Protected_Fun", metadata !"Protected_Fun", metadata !"_ZN9SomeClass13Protected_FunEv", metadata !2, i32 8, metadata !11, i1 false, i1 false, i32 0, i32 0, null, i32 258, i1 false, null} ; [ DW_TAG_subprogram ]
+!1 = metadata !{i32 589826, metadata !2, metadata !"SomeClass", metadata !2, i32 4, i64 8, i64 8, i64 0, i32 0, null, metadata !4, i32 0, null} ; [ DW_TAG_class_type ]
+!2 = metadata !{i32 589865, metadata !"/home/aherz/svn/llvm/tools/clang/test/CodeGenCXX/debug-info-member-access.cpp", metadata !"/home/aherz/svn/llvm/tools/clang/test/CodeGenCXX", metadata !3} ; [ DW_TAG_file_type ]
+!3 = metadata !{i32 589841, i32 0, i32 4, metadata !"/home/aherz/svn/llvm/tools/clang/test/CodeGenCXX/debug-info-member-access.cpp", metadata !"/home/aherz/svn/llvm/tools/clang/test/CodeGenCXX", metadata !"clang version 2.9 (trunk 116572)", i1 true, i1 false, metadata !"", i32 0} ; [ DW_TAG_compile_unit ]
+!4 = metadata !{metadata !0, metadata !5, metadata !9}
+!5 = metadata !{i32 589870, i32 0, metadata !1, metadata !"Private_Fun", metadata !"Private_Fun", metadata !"_ZN9SomeClass11Private_FunEv", metadata !2, i32 10, metadata !6, i1 false, i1 false, i32 0, i32 0, null, i32 257, i1 false, null} ; [ DW_TAG_subprogram ]
+!6 = metadata !{i32 589845, metadata !2, metadata !"", metadata !2, i32 0, i64 0, i64 0, i64 0, i32 1, null, metadata !7, i32 0, null} ; [ DW_TAG_subroutine_type ]
+!7 = metadata !{null, metadata !8}
+!8 = metadata !{i32 589839, metadata !2, metadata !"", metadata !2, i32 0, i64 64, i64 64, i64 0, i32 64, metadata !1} ; [ DW_TAG_pointer_type ]
+!9 = metadata !{i32 589870, i32 0, metadata !1, metadata !"Public_Fun", metadata !"Public_Fun", metadata !"_ZN9SomeClass10Public_FunEv", metadata !2, i32 12, metadata !10, i1 false, i1 false, i32 0, i32 0, null, i32 256, i1 false, null} ; [ DW_TAG_subprogram ]
+!10 = metadata !{i32 589845, metadata !2, metadata !"", metadata !2, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !7, i32 0, null} ; [ DW_TAG_subroutine_type ]
+!11 = metadata !{i32 589845, metadata !2, metadata !"", metadata !2, i32 0, i64 0, i64 0, i64 0, i32 2, null, metadata !7, i32 0, null} ; [ DW_TAG_subroutine_type ]
+!12 = metadata !{i32 589870, i32 0, metadata !2, metadata !"main", metadata !"main", metadata !"main", metadata !2, i32 22, metadata !13, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, i32 ()* @main} ; [ DW_TAG_subprogram ]
+!13 = metadata !{i32 589845, metadata !2, metadata !"", metadata !2, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !14, i32 0, null} ; [ DW_TAG_subroutine_type ]
+!14 = metadata !{metadata !15}
+!15 = metadata !{i32 589860, metadata !2, metadata !"int", metadata !2, i32 0, i64 32, i64 32, i64 0, i32 0, i32 5} ; [ DW_TAG_base_type ]
+!16 = metadata !{i32 589870, i32 0, metadata !2, metadata !"Public_Fun", metadata !"Public_Fun", metadata !"_ZN9SomeClass10Public_FunEv", metadata !2, i32 13, metadata !17, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (%class.SomeClass*)* @_ZN9SomeClass10Public_FunEv} ; [ DW_TAG_subprogram ]
+!17 = metadata !{i32 589845, metadata !2, metadata !"", metadata !2, i32 0, i64 0, i64 0, i64 0, i32 0, null, metadata !18, i32 0, null} ; [ DW_TAG_subroutine_type ]
+!18 = metadata !{null}
+!19 = metadata !{i32 589870, i32 0, metadata !2, metadata !"Private_Fun", metadata !"Private_Fun", metadata !"_ZN9SomeClass11Private_FunEv", metadata !2, i32 10, metadata !17, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (%class.SomeClass*)* @_ZN9SomeClass11Private_FunEv} ; [ DW_TAG_subprogram ]
+!20 = metadata !{i32 589870, i32 0, metadata !2, metadata !"Protected_Fun", metadata !"Protected_Fun", metadata !"_ZN9SomeClass13Protected_FunEv", metadata !2, i32 8, metadata !17, i1 false, i1 true, i32 0, i32 0, null, i32 256, i1 false, void (%class.SomeClass*)* @_ZN9SomeClass13Protected_FunEv} ; [ DW_TAG_subprogram ]
+!21 = metadata !{i32 589876, i32 0, metadata !2, metadata !"sc", metadata !"sc", metadata !"sc", metadata !2, i32 19, metadata !1, i1 false, i1 true, %class.SomeClass* @sc} ; [ DW_TAG_variable ]
+!22 = metadata !{i32 23, i32 2, metadata !23, null}
+!23 = metadata !{i32 589835, metadata !12, i32 22, i32 1, metadata !2, i32 0} ; [ DW_TAG_lexical_block ]
+!24 = metadata !{i32 24, i32 1, metadata !23, null}
+!25 = metadata !{i32 590081, metadata !16, metadata !"this", metadata !2, i32 12, metadata !8, i32 64} ; [ DW_TAG_arg_variable ]
+!26 = metadata !{i32 12, i32 7, metadata !16, null}
+!27 = metadata !{i32 14, i32 3, metadata !28, null}
+!28 = metadata !{i32 589835, metadata !16, i32 13, i32 2, metadata !2, i32 1} ; [ DW_TAG_lexical_block ]
+!29 = metadata !{i32 15, i32 3, metadata !28, null}
+!30 = metadata !{i32 16, i32 2, metadata !28, null}
+!31 = metadata !{i32 590081, metadata !20, metadata !"this", metadata !2, i32 8, metadata !8, i32 64} ; [ DW_TAG_arg_variable ]
+!32 = metadata !{i32 8, i32 7, metadata !20, null}
+!33 = metadata !{i32 8, i32 23, metadata !34, null}
+!34 = metadata !{i32 589835, metadata !20, i32 8, i32 22, metadata !2, i32 3} ; [ DW_TAG_lexical_block ]
+!35 = metadata !{i32 590081, metadata !19, metadata !"this", metadata !2, i32 10, metadata !8, i32 64} ; [ DW_TAG_arg_variable ]
+!36 = metadata !{i32 10, i32 7, metadata !19, null}
+!37 = metadata !{i32 10, i32 21, metadata !38, null}
+!38 = metadata !{i32 589835, metadata !19, i32 10, i32 20, metadata !2, i32 2} ; [ DW_TAG_lexical_block ]
Property changes on: test/DebugInfo/memberaccess.ll
___________________________________________________________________
Added: svn:eol-style
+ native
Index: lib/CodeGen/AsmPrinter/DwarfDebug.cpp
===================================================================
--- lib/CodeGen/AsmPrinter/DwarfDebug.cpp (revision 116700)
+++ lib/CodeGen/AsmPrinter/DwarfDebug.cpp (working copy)
@@ -1354,8 +1354,17 @@
DICompositeType SPTy = SP.getType();
DIArray Args = SPTy.getTypeArray();
unsigned SPTag = SPTy.getTag();
+
+ if (SPTag == dwarf::DW_TAG_subroutine_type)
+ {
- if (SPTag == dwarf::DW_TAG_subroutine_type)
+ if (SPTy.isProtected())
+ addUInt(SPDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
+ dwarf::DW_ACCESS_protected);
+ else if (SPTy.isPrivate())
+ addUInt(SPDie, dwarf::DW_AT_accessibility, dwarf::DW_FORM_flag,
+ dwarf::DW_ACCESS_private);
+
for (unsigned i = 1, N = Args.getNumElements(); i < N; ++i) {
DIE *Arg = new DIE(dwarf::DW_TAG_formal_parameter);
DIType ATy = DIType(DIType(Args.getElement(i)));
@@ -1364,6 +1373,7 @@
addUInt(Arg, dwarf::DW_AT_artificial, dwarf::DW_FORM_flag, 1);
SPDie->addChild(Arg);
}
+ }
}
if (SP.isArtificial())
Index: test/CodeGenCXX/debug-info-member-access.cpp
===================================================================
--- test/CodeGenCXX/debug-info-member-access.cpp (revision 0)
+++ test/CodeGenCXX/debug-info-member-access.cpp (revision 0)
@@ -0,0 +1,24 @@
+// RUN: %clang -S -emit-llvm -g -O0 %s -o ./Output/tmp.s
+// RUN: ./debug-info-member-fun-access.sh ./Output/tmp.s
+
+class SomeClass
+{
+//public:
+ protected:
+ void Protected_Fun(){}
+ private:
+ void Private_Fun(){}
+ public:
+ void Public_Fun()
+ {
+ Protected_Fun();
+ Private_Fun();
+ }
+};
+
+SomeClass sc;
+
+int main()
+{
+ sc.Public_Fun();
+}
Property changes on: test/CodeGenCXX/debug-info-member-access.cpp
___________________________________________________________________
Added: svn:eol-style
+ native
Index: test/CodeGenCXX/debug-info-member-fun-access.sh
===================================================================
--- test/CodeGenCXX/debug-info-member-fun-access.sh (revision 0)
+++ test/CodeGenCXX/debug-info-member-fun-access.sh (revision 0)
@@ -0,0 +1,7 @@
+MD_ENTRY=`grep DW_TAG_subroutine_type $1 | grep '!\([0-9]*\).*{.*, i32 1, null,.*}' | sed -E "s/.([0-9]*).*\{.*\} ; \[.*\]/\\1/"`
+#echo "Found : '$MD_ENTRY'"
+if [ $MD_ENTRY -gt 0 ]; then
+grep DW_TAG_subprogram $1 | grep '.*_ZN9SomeClass11Private_FunEv\", metadata ![0-9]*, i32 [0-9]*, metadata !'$MD_ENTRY''
+else
+exit -1
+fi
Property changes on: test/CodeGenCXX/debug-info-member-fun-access.sh
___________________________________________________________________
Added: svn:executable
+ *
Added: svn:eol-style
+ native
Index: lib/CodeGen/CGDebugInfo.cpp
===================================================================
--- lib/CodeGen/CGDebugInfo.cpp (revision 116700)
+++ lib/CodeGen/CGDebugInfo.cpp (working copy)
@@ -675,6 +675,13 @@
Elts.push_back(ThisPtrType);
}
+ unsigned BFlags=0;
+ AccessSpecifier Access = Method->getAccess();
+ if (Access == clang::AS_private)
+ BFlags |= llvm::DIType::FlagPrivate;
+ else if (Access == clang::AS_protected)
+ BFlags |= llvm::DIType::FlagProtected;
+
// Copy rest of the arguments.
for (unsigned i = 1, e = Args.getNumElements(); i != e; ++i)
Elts.push_back(Args.getElement(i));
@@ -685,7 +692,7 @@
return
DebugFactory.CreateCompositeType(llvm::dwarf::DW_TAG_subroutine_type,
Unit, "", Unit,
- 0, 0, 0, 0, 0,
+ 0, 0, 0, 0, BFlags,
llvm::DIType(), EltTypeArray);
}
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits