On Sep 3, 2009, at 2:02 AM, Daniel Dunbar wrote: > Hi Steve, > > Sorry, I had to revert this (and the next commit, which depended on > it), it was breaking all the index tests in a number of places. >
No problem. I just reapplied the 'harmless' code with some other changes. I'll fix the problem with ASTUnit separately. Thanks (and sorry for the breakage), snaroff > I tried to look into but I don't really understand what's going on... > the problem is some kind of spurious free / double free: > -- > (gdb) r > Starting program: > /Volumes/Data/Users/ddunbar/llvm.obj.64/Debug/bin/index-test > /Volumes/Data/Users/ddunbar/llvm.obj.64/tools/clang/test/Output/ > Index/find-decls.c.tmp1.ast > /Volumes/Data/Users/ddunbar/llvm.obj.64/tools/clang/test/Output/ > Index/find-decls.c.tmp2.ast > -point-at /Volumes/Data/Users/ddunbar/llvm/tools/clang/test/Index/ > t1.c:8:7 > -print-decls > Reading symbols for shared libraries +++. done > [Decl: Function bar_func] > </Volumes/Data/Users/ddunbar/llvm/tools/clang/test/Index/foo.h:4:6, > /Volumes/Data/Users/ddunbar/llvm/tools/clang/test/Index/foo.h:4:19> > [Decl: Function bar_func] > </Volumes/Data/Users/ddunbar/llvm/tools/clang/test/Index/t2.c:5:6, > /Volumes/Data/Users/ddunbar/llvm/tools/clang/test/Index/t2.c:11:1> > [Decl: Function bar_func] > </Volumes/Data/Users/ddunbar/llvm/tools/clang/test/Index/foo.h:4:6, > /Volumes/Data/Users/ddunbar/llvm/tools/clang/test/Index/foo.h:4:19> > index-test(56219) malloc: *** error for object 0x101009000: pointer > being freed was not allocated > *** set a breakpoint in malloc_error_break to debug > > Program received signal SIGABRT, Aborted. > 0x00007fff87250096 in __kill () > (gdb) bt > #0 0x00007fff87250096 in __kill () > #1 0x00007fff872f10c2 in abort () > #2 0x00007fff87208215 in free () > #3 0x00000001000692dc in clang::ExternalASTSource::~ExternalASTSource > (this=0x101009000) at > /Volumes/Data/Users/ddunbar/llvm/tools/clang/lib/AST/ASTContext.cpp: > 4040 > #4 0x000000010007db20 in > llvm::OwningPtr<clang::ExternalASTSource>::~OwningPtr > (this=0x101012288) at OwningPtr.h:35 > #5 0x000000010007ab9d in clang::ASTContext::~ASTContext > (this=0x101011e00) at > /Volumes/Data/Users/ddunbar/llvm/tools/clang/lib/AST/ASTContext.cpp:91 > #6 0x000000010002ac3f in > llvm::OwningPtr<clang::ASTContext>::~OwningPtr (this=0x1008002a0) at > OwningPtr.h:35 > #7 0x00000001000298ca in clang::ASTUnit::~ASTUnit (this=0x100800270) > at /Volumes/Data/Users/ddunbar/llvm/tools/clang/lib/Frontend/ > ASTUnit.cpp:29 > #8 0x000000010000acbb in llvm::OwningPtr<clang::ASTUnit>::~OwningPtr > (this=0x1008068a8) at OwningPtr.h:35 > #9 0x000000010000ae00 in TUnit::~TUnit (this=0x1008068a0) at > /Volumes/Data/Users/ddunbar/llvm/tools/clang/tools/index-test/index- > test.cpp:59 > #10 0x0000000100005bb1 in main (argc=6, argv=0x7fff5fbff180) at > /Volumes/Data/Users/ddunbar/llvm/tools/clang/tools/index-test/index- > test.cpp:301 > -- > > Can you take a look? > > - Daniel > > On Wed, Sep 2, 2009 at 5:32 PM, Steve Naroff<[email protected]> wrote: >> Author: snaroff >> Date: Wed Sep 2 19:32:06 2009 >> New Revision: 80859 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=80859&view=rev >> Log: >> Visit function/method bodies and issue callback for parameters and >> local variables. >> Add clang_getTranslationUnitSpelling(). >> >> >> Modified: >> cfe/trunk/include/clang-c/Index.h >> cfe/trunk/include/clang/Frontend/ASTUnit.h >> cfe/trunk/lib/Frontend/ASTUnit.cpp >> cfe/trunk/tools/CIndex/CIndex.cpp >> cfe/trunk/tools/CIndex/CIndex.exports >> cfe/trunk/tools/c-index-test/c-index-test.c >> >> Modified: cfe/trunk/include/clang-c/Index.h >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang-c/Index.h?rev=80859&r1=80858&r2=80859&view=diff >> >> = >> = >> = >> = >> = >> = >> = >> = >> = >> ===================================================================== >> --- cfe/trunk/include/clang-c/Index.h (original) >> +++ cfe/trunk/include/clang-c/Index.h Wed Sep 2 19:32:06 2009 >> @@ -95,6 +95,8 @@ >> CXIndex, const char *ast_filename >> ); >> >> +const char *clang_getTranslationUnitSpelling(CXTranslationUnit >> CTUnit); >> + >> /* >> Usage: clang_loadTranslationUnit(). Will load the toplevel >> declarations >> within a translation unit, issuing a 'callback' for each one. >> >> Modified: cfe/trunk/include/clang/Frontend/ASTUnit.h >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Frontend/ASTUnit.h?rev=80859&r1=80858&r2=80859&view=diff >> >> = >> = >> = >> = >> = >> = >> = >> = >> = >> ===================================================================== >> --- cfe/trunk/include/clang/Frontend/ASTUnit.h (original) >> +++ cfe/trunk/include/clang/Frontend/ASTUnit.h Wed Sep 2 19:32:06 >> 2009 >> @@ -28,6 +28,7 @@ >> class Preprocessor; >> class ASTContext; >> class Decl; >> + class PCHReader; >> >> /// \brief Utility class for loading a ASTContext from a PCH file. >> /// >> @@ -39,6 +40,7 @@ >> llvm::OwningPtr<TargetInfo> Target; >> llvm::OwningPtr<Preprocessor> PP; >> llvm::OwningPtr<ASTContext> Ctx; >> + llvm::OwningPtr<PCHReader> Reader; >> >> ASTUnit(const ASTUnit&); // do not implement >> ASTUnit &operator=(const ASTUnit &); // do not implement >> @@ -59,6 +61,8 @@ >> const Diagnostic &getDiagnostic() const { return *Diags.get(); } >> Diagnostic &getDiagnostic() { return *Diags.get(); } >> >> + const std::string &getOriginalSourceFileName(); >> + >> /// \brief Create a ASTUnit from a PCH file. >> /// >> /// \param Filename PCH filename >> >> Modified: cfe/trunk/lib/Frontend/ASTUnit.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/ASTUnit.cpp?rev=80859&r1=80858&r2=80859&view=diff >> >> = >> = >> = >> = >> = >> = >> = >> = >> = >> ===================================================================== >> --- cfe/trunk/lib/Frontend/ASTUnit.cpp (original) >> +++ cfe/trunk/lib/Frontend/ASTUnit.cpp Wed Sep 2 19:32:06 2009 >> @@ -77,6 +77,9 @@ >> >> } // anonymous namespace >> >> +const std::string &ASTUnit::getOriginalSourceFileName() { >> + return Reader->getOriginalSourceFile(); >> +} >> >> ASTUnit *ASTUnit::LoadFromPCHFile(const std::string &Filename, >> FileManager &FileMgr, >> @@ -101,10 +104,11 @@ >> std::string Predefines; >> unsigned Counter; >> >> - llvm::OwningPtr<PCHReader> Reader; >> + llvm::OwningPtr<PCHReader> Reader; >> llvm::OwningPtr<ExternalASTSource> Source; >> >> Reader.reset(new PCHReader(SourceMgr, FileMgr, Diags)); >> + AST->Reader.reset(Reader.get()); >> Reader->setListener(new PCHInfoCollector(LangInfo, HeaderInfo, >> TargetTriple, >> Predefines, Counter)); >> >> >> Modified: cfe/trunk/tools/CIndex/CIndex.cpp >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/CIndex/CIndex.cpp?rev=80859&r1=80858&r2=80859&view=diff >> >> = >> = >> = >> = >> = >> = >> = >> = >> = >> ===================================================================== >> --- cfe/trunk/tools/CIndex/CIndex.cpp (original) >> +++ cfe/trunk/tools/CIndex/CIndex.cpp Wed Sep 2 19:32:06 2009 >> @@ -67,6 +67,9 @@ >> break; >> } >> } >> + void VisitVarDecl(VarDecl *ND) { >> + Call(CXCursor_VarDecl, ND); >> + } >> void VisitFunctionDecl(FunctionDecl *ND) { >> Call(ND->isThisDeclarationADefinition() ? CXCursor_FunctionDefn >> : >> CXCursor_FunctionDecl, ND); >> @@ -95,6 +98,9 @@ >> CXClientData CData; >> >> void Call(enum CXCursorKind CK, NamedDecl *ND) { >> + // Disable the callback when the context is equal to the >> visiting decl. >> + if (CDecl == ND) >> + return; >> CXCursor C = { CK, ND }; >> Callback(CDecl, C, CData); >> } >> @@ -129,17 +135,28 @@ >> void VisitFieldDecl(FieldDecl *ND) { >> Call(CXCursor_FieldDecl, ND); >> } >> + void VisitVarDecl(VarDecl *ND) { >> + Call(CXCursor_VarDecl, ND); >> + } >> + void VisitParmVarDecl(ParmVarDecl *ND) { >> + Call(CXCursor_ParmDecl, ND); >> + } >> void VisitObjCPropertyDecl(ObjCPropertyDecl *ND) { >> Call(CXCursor_ObjCPropertyDecl, ND); >> } >> void VisitObjCIvarDecl(ObjCIvarDecl *ND) { >> Call(CXCursor_ObjCIvarDecl, ND); >> } >> + void VisitFunctionDecl(FunctionDecl *ND) { >> + if (ND->isThisDeclarationADefinition()) { >> + VisitDeclContext(dyn_cast<DeclContext>(ND)); >> + } >> + } >> void VisitObjCMethodDecl(ObjCMethodDecl *ND) { >> if (ND->getBody()) { >> Call(ND->isInstanceMethod() ? CXCursor_ObjCInstanceMethodDefn >> : CXCursor_ObjCClassMethodDefn, >> ND); >> - // FIXME: load body. >> + VisitDeclContext(dyn_cast<DeclContext>(ND)); >> } else >> Call(ND->isInstanceMethod() ? CXCursor_ObjCInstanceMethodDecl >> : CXCursor_ObjCClassMethodDecl, >> ND); >> @@ -167,6 +184,12 @@ >> return ASTUnit::LoadFromPCHFile(astName, CXXIdx- >> >getFileManager(), &ErrMsg); >> } >> >> +const char *clang_getTranslationUnitSpelling(CXTranslationUnit >> CTUnit) >> +{ >> + assert(CTUnit && "Passed null CXTranslationUnit"); >> + ASTUnit *CXXUnit = static_cast<ASTUnit *>(CTUnit); >> + return CXXUnit->getOriginalSourceFileName().c_str(); >> +} >> >> void clang_loadTranslationUnit(CXTranslationUnit CTUnit, >> CXTranslationUnitIterator callback, >> >> Modified: cfe/trunk/tools/CIndex/CIndex.exports >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/CIndex/CIndex.exports?rev=80859&r1=80858&r2=80859&view=diff >> >> = >> = >> = >> = >> = >> = >> = >> = >> = >> ===================================================================== >> --- cfe/trunk/tools/CIndex/CIndex.exports (original) >> +++ cfe/trunk/tools/CIndex/CIndex.exports Wed Sep 2 19:32:06 2009 >> @@ -19,3 +19,4 @@ >> _clang_isDefinition >> _clang_getCursorSpelling >> _clang_getCursorKindSpelling >> +_clang_getTranslationUnitSpelling >> >> Modified: cfe/trunk/tools/c-index-test/c-index-test.c >> URL: >> http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/c-index-test/c-index-test.c?rev=80859&r1=80858&r2=80859&view=diff >> >> = >> = >> = >> = >> = >> = >> = >> = >> = >> ===================================================================== >> --- cfe/trunk/tools/c-index-test/c-index-test.c (original) >> +++ cfe/trunk/tools/c-index-test/c-index-test.c Wed Sep 2 19:32:06 >> 2009 >> @@ -3,25 +3,27 @@ >> #include "clang-c/Index.h" >> #include <stdio.h> >> >> +static void PrintCursor(CXCursor Cursor) { >> + printf("%s => %s", clang_getCursorKindSpelling(Cursor.kind), >> + clang_getCursorSpelling(Cursor)); >> + printf(" (%s,%d:%d)\n", clang_getCursorSource(Cursor), >> + clang_getCursorLine(Cursor), >> + clang_getCursorColumn(Cursor)); >> +} >> + >> static void DeclVisitor(CXDecl Dcl, CXCursor Cursor, CXClientData >> Filter) >> { >> - if (!Filter || (Cursor.kind == *(enum CXCursorKind *)Filter)) { >> - printf("%s => %s", clang_getCursorKindSpelling(Cursor.kind), >> - clang_getCursorSpelling(Cursor)); >> - printf(" (%s,%d:%d)\n", clang_getCursorSource(Cursor), >> - clang_getCursorLine(Cursor), >> - clang_getCursorColumn(Cursor)); >> - } >> + printf("%s: ", clang_getDeclSpelling(Dcl)); >> + if (!Filter || (Cursor.kind == *(enum CXCursorKind *)Filter)) >> + PrintCursor(Cursor); >> } >> + >> static void TranslationUnitVisitor(CXTranslationUnit Unit, >> CXCursor Cursor, >> CXClientData Filter) >> { >> + printf("%s: ", clang_getTranslationUnitSpelling(Unit)); >> if (!Filter || (Cursor.kind == *(enum CXCursorKind *)Filter)) { >> - printf("%s => %s", clang_getCursorKindSpelling(Cursor.kind), >> - clang_getCursorSpelling(Cursor)); >> - printf(" (%s,%d:%d)\n", clang_getCursorSource(Cursor), >> - clang_getCursorLine(Cursor), >> - clang_getCursorColumn(Cursor)); >> + PrintCursor(Cursor); >> >> clang_loadDeclaration(Cursor.decl, DeclVisitor, 0); >> } >> >> >> _______________________________________________ >> cfe-commits mailing list >> [email protected] >> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >> _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
