aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitri Gribenko <gribozavr@gmail.com>2012-07-18 16:30:42 +0000
committerDmitri Gribenko <gribozavr@gmail.com>2012-07-18 16:30:42 +0000
commitfb3643a7509dcde7fb0fb7290e4b3b42b317700c (patch)
tree9a666fde7ce415cdb7fcb8a1c87629e4d99fac80
parent572eec1bdeb3b782d27aedd27c36a8d8168e261c (diff)
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
-rw-r--r--include/clang/AST/Comment.h1
-rw-r--r--lib/AST/Comment.cpp14
-rw-r--r--lib/AST/CommentDumper.cpp10
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';
}