r203317 - Module [extern_c] attribute: inherit to submodules, don't write 'extern "C"'
NAKAMURA Takumi
geek4civic at gmail.com
Sun Mar 9 01:18:09 PST 2014
2014-03-08 9:03 GMT+09:00 Richard Smith <richard-llvm at metafoo.co.uk>:
> 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++];
Richard, I saw a few tests crashed due to incompatibility of file format.
Failing Tests (2):
Clang :: Index/retain-comments-from-system-headers.c
Clang Tools :: pp-trace/pp-trace-modules.cpp
How to reproduce:
- rm -rf tools/clang/test/Index/Output
- Checkout r203316
- Build and run a test (Index/retain-comments-from-system-headers.c)
- Checkout r203318 (yours)
- Build and run a test w/o removing test tree.
Lit might be required to sweep Output(s) in test directories, or
ASTReader might be responsible to check micro-version.
Any idea?
> 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
> )
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list