aboutsummaryrefslogtreecommitdiff
path: root/Driver/ASTConsumers.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Driver/ASTConsumers.cpp')
-rw-r--r--Driver/ASTConsumers.cpp17
1 files changed, 17 insertions, 0 deletions
diff --git a/Driver/ASTConsumers.cpp b/Driver/ASTConsumers.cpp
index aa49e2adc5..1bbdf388c4 100644
--- a/Driver/ASTConsumers.cpp
+++ b/Driver/ASTConsumers.cpp
@@ -39,6 +39,7 @@ namespace {
void PrintDecl(Decl *D);
void PrintFunctionDeclStart(FunctionDecl *FD);
void PrintTypeDefDecl(TypedefDecl *TD);
+ void PrintLinkageSpec(LinkageSpecDecl *LS);
void PrintObjCMethodDecl(ObjCMethodDecl *OMD);
void PrintObjCImplementationDecl(ObjCImplementationDecl *OID);
void PrintObjCInterfaceDecl(ObjCInterfaceDecl *OID);
@@ -94,6 +95,8 @@ void DeclPrinter:: PrintDecl(Decl *D) {
Out << "Read top-level tag decl: '" << TD->getName() << "'\n";
} else if (ScopedDecl *SD = dyn_cast<ScopedDecl>(D)) {
Out << "Read top-level variable decl: '" << SD->getName() << "'\n";
+ } else if (LinkageSpecDecl *LSD = dyn_cast<LinkageSpecDecl>(D)) {
+ PrintLinkageSpec(LSD);
} else {
assert(0 && "Unknown decl type!");
}
@@ -152,6 +155,18 @@ void DeclPrinter::PrintTypeDefDecl(TypedefDecl *TD) {
Out << "typedef " << S << ";\n";
}
+void DeclPrinter::PrintLinkageSpec(LinkageSpecDecl *LS) {
+ const char *l;
+ if (LS->getLanguage() == LinkageSpecDecl::lang_c)
+ l = "C";
+ else if (LS->getLanguage() == LinkageSpecDecl::lang_cxx)
+ l = "C++";
+ else assert(0 && "unknown language in linkage specification");
+ Out << "extern \"" << l << "\" { ";
+ PrintDecl(LS->getDecl());
+ Out << "}\n";
+}
+
void DeclPrinter::PrintObjCMethodDecl(ObjCMethodDecl *OMD) {
if (OMD->isInstance())
Out << "\n- ";
@@ -608,6 +623,8 @@ namespace {
CodeGen::CodeGenFunction(Builder, FD);
} else if (FileVarDecl *FVD = dyn_cast<FileVarDecl>(D)) {
CodeGen::CodeGenGlobalVar(Builder, FVD);
+ } else if (LinkageSpecDecl *LSD = dyn_cast<LinkageSpecDecl>(D)) {
+ CodeGen::CodeGenLinkageSpec(Builder, LSD);
} else {
assert(isa<TypeDecl>(D) && "Only expected type decls here");
// don't codegen for now, eventually pass down for debug info.