Author: kremenek
Date: Thu Apr 29 12:43:29 2010
New Revision: 102641
URL: http://llvm.org/viewvc/llvm-project?rev=102641&view=rev
Log:
Add USR support for 'static inline' functions (which can be declared in header
files).
Add USR support for 'static' functions and local variables, which can be handy
for resolving named variables within a translation unit.
Modified:
cfe/trunk/test/Index/usrs.m
cfe/trunk/tools/CIndex/CIndexUSRs.cpp
Modified: cfe/trunk/test/Index/usrs.m
URL:
http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Index/usrs.m?rev=102641&r1=102640&r2=102641&view=diff
==============================================================================
--- cfe/trunk/test/Index/usrs.m (original)
+++ cfe/trunk/test/Index/usrs.m Thu Apr 29 12:43:29 2010
@@ -1,5 +1,7 @@
// RUN: c-index-test -test-load-source-usrs all %s | FileCheck %s
+static inline int my_helper(int x, int y) { return x + y; }
+
enum {
ABA,
CADABA
@@ -36,6 +38,7 @@
return 0;
}
+ (id) kingkong {
+ int local_var;
return 0;
}
@synthesize d1;
@@ -43,32 +46,42 @@
int z;
-// CHECK: usrs.m c:@[email protected]@3:1 Extent=[3:1 - 6:2]
-// CHECK: usrs.m c:@[email protected]@3:1...@aba Extent=[4:3 - 4:6]
-// CHECK: usrs.m c:@[email protected]@3:1...@cadaba Extent=[5:3 - 5:9]
-// CHECK: usrs.m c:@[email protected]@8:1 Extent=[8:1 - 11:2]
-// CHECK: usrs.m c:@[email protected]@8:1...@foo Extent=[9:3 - 9:6]
-// CHECK: usrs.m c:@[email protected]@8:1...@bar Extent=[10:3 - 10:6]
-// CHECK: usrs.m c:@s...@mystruct Extent=[13:9 - 16:2]
-// CHECK: usrs.m c:@s...@mystruct@f...@wa Extent=[14:7 - 14:9]
-// CHECK: usrs.m c:@s...@mystruct@f...@moo Extent=[15:7 - 15:10]
-// CHECK: usrs.m c:@[email protected]@16:3...@mystruct Extent=[16:3 - 16:11]
-// CHECK: usrs.m c:@e...@pizza Extent=[18:1 - 21:2]
-// CHECK: usrs.m c:@e...@pizza@CHEESE Extent=[19:3 - 19:9]
-// CHECK: usrs.m c:@e...@pizza@MUSHROOMS Extent=[20:3 - 20:12]
-// CHECK: usrs.m c:objc(cs)Foo Extent=[23:1 - 30:5]
-// CHECK: usrs.m c:objc(cs)f...@x Extent=[24:6 - 24:7]
-// CHECK: usrs.m c:objc(cs)f...@y Extent=[25:6 - 25:7]
-// CHECK: usrs.m c:objc(cs)Foo(py)d1 Extent=[29:15 - 29:17]
-// CHECK: usrs.m c:objc(cs)Foo(im)godzilla Extent=[27:1 - 27:17]
-// CHECK: usrs.m c:objc(cs)Foo(cm)kingkong Extent=[28:1 - 28:17]
-// CHECK: usrs.m c:objc(cs)Foo(im)d1 Extent=[29:15 - 29:17]
-// CHECK: usrs.m c:objc(cs)Foo(im)setD1: Extent=[29:15 - 29:17]
-// CHECK: usrs.m c:objc(cs)Foo Extent=[32:1 - 42:2]
-// CHECK: usrs.m c:objc(cs)Foo(im)godzilla Extent=[33:1 - 37:2]
-// CHECK: usrs.m c:@z Extent=[35:10 - 35:15]
-// CHECK: usrs.m c:objc(cs)Foo(cm)kingkong Extent=[38:1 - 40:2]
-// CHECK: usrs.m c:objc(cs)f...@d1 Extent=[41:13 - 41:15]
-// CHECK: usrs.m c:objc(cs)Foo(py)d1 Extent=[41:1 - 41:15]
-// CHECK: usrs.m c:@z Extent=[44:1 - 44:6]
+static int local_func(int x) { return x; }
+
+// CHECK: usrs.m c:usr...@3:1...@f@my_helper Extent=[3:19 - 3:60]
+// CHECK: usrs.m c:usr...@3:2...@x Extent=[3:29 - 3:34]
+// CHECK: usrs.m c:usr...@3:3...@y Extent=[3:36 - 3:41]
+// CHECK: usrs.m c:@[email protected]@5:1 Extent=[5:1 - 8:2]
+// CHECK: usrs.m c:@[email protected]@5:1...@aba Extent=[6:3 - 6:6]
+// CHECK: usrs.m c:@[email protected]@5:1...@cadaba Extent=[7:3 - 7:9]
+// CHECK: usrs.m c:@[email protected]@10:1 Extent=[10:1 - 13:2]
+// CHECK: usrs.m c:@[email protected]@10:1...@foo Extent=[11:3 - 11:6]
+// CHECK: usrs.m c:@[email protected]@10:1...@bar Extent=[12:3 - 12:6]
+// CHECK: usrs.m c:@s...@mystruct Extent=[15:9 - 18:2]
+// CHECK: usrs.m c:@s...@mystruct@f...@wa Extent=[16:7 - 16:9]
+// CHECK: usrs.m c:@s...@mystruct@f...@moo Extent=[17:7 - 17:10]
+// CHECK: usrs.m c:@[email protected]@18:3...@mystruct Extent=[18:3 - 18:11]
+// CHECK: usrs.m c:@e...@pizza Extent=[20:1 - 23:2]
+// CHECK: usrs.m c:@e...@pizza@CHEESE Extent=[21:3 - 21:9]
+// CHECK: usrs.m c:@e...@pizza@MUSHROOMS Extent=[22:3 - 22:12]
+// CHECK: usrs.m c:objc(cs)Foo Extent=[25:1 - 32:5]
+// CHECK: usrs.m c:objc(cs)f...@x Extent=[26:6 - 26:7]
+// CHECK: usrs.m c:objc(cs)f...@y Extent=[27:6 - 27:7]
+// CHECK: usrs.m c:objc(cs)Foo(py)d1 Extent=[31:15 - 31:17]
+// CHECK: usrs.m c:objc(cs)Foo(im)godzilla Extent=[29:1 - 29:17]
+// CHECK: usrs.m c:objc(cs)Foo(cm)kingkong Extent=[30:1 - 30:17]
+// CHECK: usrs.m c:objc(cs)Foo(im)d1 Extent=[31:15 - 31:17]
+// CHECK: usrs.m c:objc(cs)Foo(im)setD1: Extent=[31:15 - 31:17]
+// CHECK: usrs.m c:usr...@31:1...@d1 Extent=[31:15 - 31:17]
+// CHECK: usrs.m c:objc(cs)Foo Extent=[34:1 - 45:2]
+// CHECK: usrs.m c:objc(cs)Foo(im)godzilla Extent=[35:1 - 39:2]
+// CHECK: usrs.m c:usr...@36:1...@a Extent=[36:10 - 36:19]
+// CHECK: usrs.m c:@z Extent=[37:10 - 37:15]
+// CHECK: usrs.m c:objc(cs)Foo(cm)kingkong Extent=[40:1 - 43:2]
+// CHECK: usrs.m c:usr...@41:3...@local_var Extent=[41:3 - 41:16]
+// CHECK: usrs.m c:objc(cs)f...@d1 Extent=[44:13 - 44:15]
+// CHECK: usrs.m c:objc(cs)Foo(py)d1 Extent=[44:1 - 44:15]
+// CHECK: usrs.m c:@z Extent=[47:1 - 47:6]
+// CHECK: usrs.m c:usr...@49:1...@f@local_func Extent=[49:12 - 49:43]
+// CHECK: usrs.m c:usr...@49:2...@x Extent=[49:23 - 49:28]
Modified: cfe/trunk/tools/CIndex/CIndexUSRs.cpp
URL:
http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/CIndex/CIndexUSRs.cpp?rev=102641&r1=102640&r2=102641&view=diff
==============================================================================
--- cfe/trunk/tools/CIndex/CIndexUSRs.cpp (original)
+++ cfe/trunk/tools/CIndex/CIndexUSRs.cpp Thu Apr 29 12:43:29 2010
@@ -131,7 +131,14 @@
}
void USRGenerator::VisitFunctionDecl(FunctionDecl *D) {
- VisitDeclContext(D->getDeclContext());
+ if (D->getLinkage() != ExternalLinkage) {
+ GenLoc(D);
+ if (IgnoreResults)
+ return;
+ }
+ else
+ VisitDeclContext(D->getDeclContext());
+
Out << "@F@" << D;
}
@@ -152,10 +159,15 @@
// VarDecls can be declared 'extern' within a function or method body,
// but their enclosing DeclContext is the function, not the TU. We need
// to check the storage class to correctly generate the USR.
- if (!D->hasExternalStorage())
- VisitDeclContext(D->getDeclContext());
+ if (D->getLinkage() != ExternalLinkage) {
+ GenLoc(D);
+ if (IgnoreResults)
+ return;
+ }
+
+ // Variables always have simple names.
+ llvm::StringRef s = D->getName();
- const std::string &s = D->getNameAsString();
// The string can be empty if the declaration has no name; e.g., it is
// the ParmDecl with no name for declaration of a function pointer type,
e.g.:
// void (*f)(void *);
@@ -377,10 +389,13 @@
// enums/anonymous structs/etc. defined in a common header file
// are referred to across multiple translation units.
if (isa<TagDecl>(ND) || isa<TypedefDecl>(ND) ||
- isa<EnumConstantDecl>(ND) || isa<FieldDecl>(ND))
+ isa<EnumConstantDecl>(ND) || isa<FieldDecl>(ND) ||
+ isa<VarDecl>(ND))
break;
// Fall-through.
case InternalLinkage:
+ if (isa<FunctionDecl>(ND))
+ break;
case UniqueExternalLinkage:
return createCXString("");
}
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits