From fb3643a7509dcde7fb0fb7290e4b3b42b317700c Mon Sep 17 00:00:00 2001 From: Dmitri Gribenko Date: Wed, 18 Jul 2012 16:30:42 +0000 Subject: [PATCH] On Darwin, the linker removes functions in CommentDumper.o (Comment::dump()) despite __attribute__(__used__). As explained by Argyrios, > .a archive files do some stripping of their own and they remove .o files that > contain functions that are not referenced by any other .o file. The fix is to use these functions from another .o file. Thanks, Argyrios! git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@160437 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/AST/Comment.h | 1 + lib/AST/Comment.cpp | 14 ++++++++++++++ lib/AST/CommentDumper.cpp | 10 ++-------- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/include/clang/AST/Comment.h b/include/clang/AST/Comment.h index 05ad33fe3a..39753cfbd9 100644 --- a/include/clang/AST/Comment.h +++ b/include/clang/AST/Comment.h @@ -115,6 +115,7 @@ public: LLVM_ATTRIBUTE_USED void dump() const; LLVM_ATTRIBUTE_USED void dump(SourceManager &SM) const; + void dump(llvm::raw_ostream &OS, SourceManager *SM) const; static bool classof(const Comment *) { return true; } diff --git a/lib/AST/Comment.cpp b/lib/AST/Comment.cpp index 1520d13417..e215e63dec 100644 --- a/lib/AST/Comment.cpp +++ b/lib/AST/Comment.cpp @@ -9,6 +9,7 @@ #include "clang/AST/Comment.h" #include "llvm/Support/ErrorHandling.h" +#include "llvm/Support/raw_ostream.h" namespace clang { namespace comments { @@ -27,6 +28,19 @@ const char *Comment::getCommentKindName() const { llvm_unreachable("Unknown comment kind!"); } +void Comment::dump() const { + // It is important that Comment::dump() is defined in a different TU than + // Comment::dump(raw_ostream, SourceManager). If both functions were defined + // in CommentDumper.cpp, that object file would be removed by linker because + // none of its functions are referenced by other object files, despite the + // LLVM_ATTRIBUTE_USED. + dump(llvm::errs(), NULL); +} + +void Comment::dump(SourceManager &SM) const { + dump(llvm::errs(), &SM); +} + namespace { struct good {}; struct bad {}; diff --git a/lib/AST/CommentDumper.cpp b/lib/AST/CommentDumper.cpp index 7a075a6748..5de5ef544f 100644 --- a/lib/AST/CommentDumper.cpp +++ b/lib/AST/CommentDumper.cpp @@ -181,14 +181,8 @@ void CommentDumper::visitFullComment(const FullComment *C) { } // unnamed namespace -void Comment::dump() const { - CommentDumper D(llvm::errs(), NULL); - D.dumpSubtree(this); - llvm::errs() << '\n'; -} - -void Comment::dump(SourceManager &SM) const { - CommentDumper D(llvm::errs(), &SM); +void Comment::dump(llvm::raw_ostream &OS, SourceManager *SM) const { + CommentDumper D(llvm::errs(), SM); D.dumpSubtree(this); llvm::errs() << '\n'; } -- 2.50.1