r203317 - Module [extern_c] attribute: inherit to submodules, don't write 'extern "C"'

Richard Smith richard-llvm at metafoo.co.uk
Fri Mar 7 16:03:56 PST 2014


Author: rsmith
Date: Fri Mar  7 18:03:56 2014
New Revision: 203317

URL: http://llvm.org/viewvc/llvm-project?rev=203317&view=rev
Log:
Module [extern_c] attribute: inherit to submodules, don't write 'extern "C"'
blocks when building in C mode, and serialize and deserialize the attribute.

Added:
    cfe/trunk/test/Modules/Inputs/elsewhere/
    cfe/trunk/test/Modules/Inputs/elsewhere/c-header-indirect.h
    cfe/trunk/test/Modules/Inputs/elsewhere/module.map
Modified:
    cfe/trunk/lib/Basic/Module.cpp
    cfe/trunk/lib/Frontend/FrontendActions.cpp
    cfe/trunk/lib/Serialization/ASTReader.cpp
    cfe/trunk/lib/Serialization/ASTWriter.cpp
    cfe/trunk/test/Modules/Inputs/module.map
    cfe/trunk/test/Modules/extern_c.cpp
    cfe/trunk/unittests/AST/CMakeLists.txt

Modified: cfe/trunk/lib/Basic/Module.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Module.cpp?rev=203317&r1=203316&r2=203317&view=diff
==============================================================================
--- cfe/trunk/lib/Basic/Module.cpp (original)
+++ cfe/trunk/lib/Basic/Module.cpp Fri Mar  7 18:03:56 2014
@@ -37,6 +37,8 @@ Module::Module(StringRef Name, SourceLoc
       IsAvailable = false;
     if (Parent->IsSystem)
       IsSystem = true;
+    if (Parent->IsExternC)
+      IsExternC = true;
     
     Parent->SubModuleIndex[Name] = Parent->SubModules.size();
     Parent->SubModules.push_back(this);

Modified: cfe/trunk/lib/Frontend/FrontendActions.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/FrontendActions.cpp?rev=203317&r1=203316&r2=203317&view=diff
==============================================================================
--- cfe/trunk/lib/Frontend/FrontendActions.cpp (original)
+++ cfe/trunk/lib/Frontend/FrontendActions.cpp Fri Mar  7 18:03:56 2014
@@ -132,7 +132,7 @@ static void addHeaderInclude(StringRef H
                              SmallVectorImpl<char> &Includes,
                              const LangOptions &LangOpts,
                              bool IsExternC) {
-  if (IsExternC)
+  if (IsExternC && LangOpts.CPlusPlus)
     Includes += "extern \"C\" {\n";
   if (LangOpts.ObjC1)
     Includes += "#import \"";
@@ -140,7 +140,7 @@ static void addHeaderInclude(StringRef H
     Includes += "#include \"";
   Includes += HeaderName;
   Includes += "\"\n";
-  if (IsExternC)
+  if (IsExternC && LangOpts.CPlusPlus)
     Includes += "}\n";
 }
 

Modified: cfe/trunk/lib/Serialization/ASTReader.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTReader.cpp?rev=203317&r1=203316&r2=203317&view=diff
==============================================================================
--- cfe/trunk/lib/Serialization/ASTReader.cpp (original)
+++ cfe/trunk/lib/Serialization/ASTReader.cpp Fri Mar  7 18:03:56 2014
@@ -3996,15 +3996,17 @@ bool ASTReader::ReadSubmoduleBlock(Modul
       }
       
       StringRef Name = Blob;
-      SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[0]);
-      SubmoduleID Parent = getGlobalSubmoduleID(F, Record[1]);
-      bool IsFramework = Record[2];
-      bool IsExplicit = Record[3];
-      bool IsSystem = Record[4];
-      bool InferSubmodules = Record[5];
-      bool InferExplicitSubmodules = Record[6];
-      bool InferExportWildcard = Record[7];
-      bool ConfigMacrosExhaustive = Record[8];
+      unsigned Idx = 0;
+      SubmoduleID GlobalID = getGlobalSubmoduleID(F, Record[Idx++]);
+      SubmoduleID Parent = getGlobalSubmoduleID(F, Record[Idx++]);
+      bool IsFramework = Record[Idx++];
+      bool IsExplicit = Record[Idx++];
+      bool IsSystem = Record[Idx++];
+      bool IsExternC = Record[Idx++];
+      bool InferSubmodules = Record[Idx++];
+      bool InferExplicitSubmodules = Record[Idx++];
+      bool InferExportWildcard = Record[Idx++];
+      bool ConfigMacrosExhaustive = Record[Idx++];
 
       Module *ParentModule = 0;
       if (Parent)
@@ -4040,6 +4042,7 @@ bool ASTReader::ReadSubmoduleBlock(Modul
       
       CurrentModule->IsFromModuleFile = true;
       CurrentModule->IsSystem = IsSystem || CurrentModule->IsSystem;
+      CurrentModule->IsExternC = IsExternC;
       CurrentModule->InferSubmodules = InferSubmodules;
       CurrentModule->InferExplicitSubmodules = InferExplicitSubmodules;
       CurrentModule->InferExportWildcard = InferExportWildcard;

Modified: cfe/trunk/lib/Serialization/ASTWriter.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Serialization/ASTWriter.cpp?rev=203317&r1=203316&r2=203317&view=diff
==============================================================================
--- cfe/trunk/lib/Serialization/ASTWriter.cpp (original)
+++ cfe/trunk/lib/Serialization/ASTWriter.cpp Fri Mar  7 18:03:56 2014
@@ -2225,7 +2225,8 @@ void ASTWriter::WriteSubmodules(Module *
   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Parent
   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // IsFramework
   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // IsExplicit
-  Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // IsSystem  
+  Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // IsSystem
+  Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // IsExternC
   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // InferSubmodules...
   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // InferExplicit...
   Abbrev->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 1)); // InferExportWild...
@@ -2313,6 +2314,7 @@ void ASTWriter::WriteSubmodules(Module *
     Record.push_back(Mod->IsFramework);
     Record.push_back(Mod->IsExplicit);
     Record.push_back(Mod->IsSystem);
+    Record.push_back(Mod->IsExternC);
     Record.push_back(Mod->InferSubmodules);
     Record.push_back(Mod->InferExplicitSubmodules);
     Record.push_back(Mod->InferExportWildcard);

Added: cfe/trunk/test/Modules/Inputs/elsewhere/c-header-indirect.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/elsewhere/c-header-indirect.h?rev=203317&view=auto
==============================================================================
--- cfe/trunk/test/Modules/Inputs/elsewhere/c-header-indirect.h (added)
+++ cfe/trunk/test/Modules/Inputs/elsewhere/c-header-indirect.h Fri Mar  7 18:03:56 2014
@@ -0,0 +1 @@
+#include "c-header.h"

Added: cfe/trunk/test/Modules/Inputs/elsewhere/module.map
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/elsewhere/module.map?rev=203317&view=auto
==============================================================================
--- cfe/trunk/test/Modules/Inputs/elsewhere/module.map (added)
+++ cfe/trunk/test/Modules/Inputs/elsewhere/module.map Fri Mar  7 18:03:56 2014
@@ -0,0 +1 @@
+module c_library_indirect { header "c-header-indirect.h" }

Modified: cfe/trunk/test/Modules/Inputs/module.map
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/Inputs/module.map?rev=203317&r1=203316&r2=203317&view=diff
==============================================================================
--- cfe/trunk/test/Modules/Inputs/module.map (original)
+++ cfe/trunk/test/Modules/Inputs/module.map Fri Mar  7 18:03:56 2014
@@ -1,4 +1,4 @@
-module c_library [extern_c] { header "c-header.h" }
+module c_library [extern_c] { module inner { header "c-header.h" } }
 module cxx_library { header "cxx-header.h" requires cplusplus }
 module c_library_bad [extern_c] { header "c-header-bad.h" }
 module diamond_top { header "diamond_top.h" }

Modified: cfe/trunk/test/Modules/extern_c.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Modules/extern_c.cpp?rev=203317&r1=203316&r2=203317&view=diff
==============================================================================
--- cfe/trunk/test/Modules/extern_c.cpp (original)
+++ cfe/trunk/test/Modules/extern_c.cpp Fri Mar  7 18:03:56 2014
@@ -9,6 +9,12 @@
 // RUN: %clang_cc1 -fmodules -verify -fmodules-cache-path=%t -I %S/Inputs %s -DCXX_HEADER -DEXTERN_CXX
 // RUN: %clang_cc1 -fmodules -verify -fmodules-cache-path=%t -I %S/Inputs %s -DCXX_HEADER -DEXTERN_C -DEXTERN_CXX
 // RUN: %clang_cc1 -fmodules -verify -fmodules-cache-path=%t -I %S/Inputs %s -DCXX_HEADER -DEXTERN_C -DNAMESPACE
+// RUN: %clang_cc1 -fmodules -verify -fmodules-cache-path=%t -I %S/Inputs -x c %s
+// RUN: %clang_cc1 -fmodules -verify -fmodules-cache-path=%t -I %S/Inputs/elsewhere -I %S/Inputs %s -DEXTERN_C -DINDIRECT
+
+#ifdef INDIRECT
+#include "c-header-indirect.h"
+#endif
 
 #ifdef NAMESPACE
 namespace M {
@@ -34,7 +40,7 @@ extern "C++" {
 // expected-error at -3 {{import of C++ module 'cxx_library' appears within extern "C" language linkage specification}}
 // expected-note at -17 {{extern "C" language linkage specification begins here}}
 #elif defined(NAMESPACE)
-// expected-error-re at -6 {{import of module '{{c_library|cxx_library}}' appears within namespace 'M'}}
+// expected-error-re at -6 {{import of module '{{c_library.inner|cxx_library}}' appears within namespace 'M'}}
 // expected-note at -24 {{namespace 'M' begins here}}
 #endif
 
@@ -51,16 +57,25 @@ extern "C++" {
 using namespace M;
 #endif
 
+#ifdef __cplusplus
 namespace N {
-  int k = f();
+#endif
+  void g() {
+    int k = f();
+  }
 
+#ifdef __cplusplus
   extern "C" {
+#endif
     int f;
 #if !defined(CXX_HEADER)
     // expected-error at -2 {{redefinition of 'f' as different kind of symbol}}
     // expected-note at c-header.h:1 {{previous}}
 #endif
+
+#ifdef __cplusplus
   }
 }
+#endif
 
-suppress_expected_no_diagnostics_error; // expected-error {{}}
+suppress_expected_no_diagnostics_error error_here; // expected-error {{}}

Modified: cfe/trunk/unittests/AST/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/AST/CMakeLists.txt?rev=203317&r1=203316&r2=203317&view=diff
==============================================================================
--- cfe/trunk/unittests/AST/CMakeLists.txt (original)
+++ cfe/trunk/unittests/AST/CMakeLists.txt Fri Mar  7 18:03:56 2014
@@ -10,6 +10,7 @@ add_clang_unittest(ASTTests
   CommentParser.cpp
   DeclPrinterTest.cpp
   DeclTest.cpp
+  ExternalASTSourceTest.cpp
   SourceLocationTest.cpp
   StmtPrinterTest.cpp
   )





More information about the cfe-commits mailing list