r309014 - [ExternalASTMerger] Import Objective-C classes
Sean Callanan via cfe-commits
cfe-commits at lists.llvm.org
Tue Jul 25 12:54:22 PDT 2017
Author: spyffe
Date: Tue Jul 25 12:54:22 2017
New Revision: 309014
URL: http://llvm.org/viewvc/llvm-project?rev=309014&view=rev
Log:
[ExternalASTMerger] Import Objective-C classes
This patch adds functionality and a test for importing Objective-C classes
and their methods.
It also adds a flag to clang-import-test to set the language used for
parsing. This takes the same argument format as the -x option to the
driver.
Differential Revision: https://reviews.llvm.org/D35274
Added:
cfe/trunk/test/Import/objc-method/
- copied from r308993, cfe/trunk/test/Import/member-in-struct/
cfe/trunk/test/Import/objc-method/Inputs/S.m
- copied, changed from r308993, cfe/trunk/test/Import/member-in-struct/Inputs/S.c
cfe/trunk/test/Import/objc-method/test.m
- copied, changed from r308993, cfe/trunk/test/Import/member-in-struct/test.c
Removed:
cfe/trunk/test/Import/objc-method/Inputs/S.c
cfe/trunk/test/Import/objc-method/test.c
Modified:
cfe/trunk/lib/AST/ExternalASTMerger.cpp
cfe/trunk/tools/clang-import-test/clang-import-test.cpp
Modified: cfe/trunk/lib/AST/ExternalASTMerger.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ExternalASTMerger.cpp?rev=309014&r1=309013&r2=309014&view=diff
==============================================================================
--- cfe/trunk/lib/AST/ExternalASTMerger.cpp (original)
+++ cfe/trunk/lib/AST/ExternalASTMerger.cpp Tue Jul 25 12:54:22 2017
@@ -44,6 +44,9 @@ public:
ToTag->setMustBuildLookupTable();
} else if (auto ToNamespace = dyn_cast<NamespaceDecl>(To)) {
ToNamespace->setHasExternalVisibleStorage();
+ } else if (auto ToContainer = dyn_cast<ObjCContainerDecl>(To)) {
+ ToContainer->setHasExternalLexicalStorage();
+ ToContainer->setMustBuildLookupTable();
}
return ASTImporter::Imported(From, To);
}
@@ -80,11 +83,12 @@ LookupSameContext(Source<TranslationUnit
}
bool IsForwardDeclaration(Decl *D) {
- assert(!isa<ObjCInterfaceDecl>(D)); // TODO handle this case
if (auto TD = dyn_cast<TagDecl>(D)) {
return !TD->isThisDeclarationADefinition();
} else if (auto FD = dyn_cast<FunctionDecl>(D)) {
return !FD->isThisDeclarationADefinition();
+ } else if (auto OID = dyn_cast<ObjCInterfaceDecl>(D)) {
+ return OID->isThisDeclarationADefinition();
} else {
return false;
}
Removed: cfe/trunk/test/Import/objc-method/Inputs/S.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Import/member-in-struct/Inputs/S.c?rev=308993&view=auto
==============================================================================
--- cfe/trunk/test/Import/objc-method/Inputs/S.c (original)
+++ cfe/trunk/test/Import/objc-method/Inputs/S.c (removed)
@@ -1,3 +0,0 @@
-struct S {
- int a;
-};
Copied: cfe/trunk/test/Import/objc-method/Inputs/S.m (from r308993, cfe/trunk/test/Import/member-in-struct/Inputs/S.c)
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Import/objc-method/Inputs/S.m?p2=cfe/trunk/test/Import/objc-method/Inputs/S.m&p1=cfe/trunk/test/Import/member-in-struct/Inputs/S.c&r1=308993&r2=309014&rev=309014&view=diff
==============================================================================
--- cfe/trunk/test/Import/member-in-struct/Inputs/S.c (original)
+++ cfe/trunk/test/Import/objc-method/Inputs/S.m Tue Jul 25 12:54:22 2017
@@ -1,3 +1,4 @@
-struct S {
- int a;
-};
+ at interface C {
+}
+-(int)m;
+ at end
Removed: cfe/trunk/test/Import/objc-method/test.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Import/member-in-struct/test.c?rev=308993&view=auto
==============================================================================
--- cfe/trunk/test/Import/objc-method/test.c (original)
+++ cfe/trunk/test/Import/objc-method/test.c (removed)
@@ -1,5 +0,0 @@
-// RUN: clang-import-test -import %S/Inputs/S.c -expression %s
-void expr() {
- struct S MyS;
- MyS.a = 3;
-}
Copied: cfe/trunk/test/Import/objc-method/test.m (from r308993, cfe/trunk/test/Import/member-in-struct/test.c)
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Import/objc-method/test.m?p2=cfe/trunk/test/Import/objc-method/test.m&p1=cfe/trunk/test/Import/member-in-struct/test.c&r1=308993&r2=309014&rev=309014&view=diff
==============================================================================
--- cfe/trunk/test/Import/member-in-struct/test.c (original)
+++ cfe/trunk/test/Import/objc-method/test.m Tue Jul 25 12:54:22 2017
@@ -1,5 +1,5 @@
-// RUN: clang-import-test -import %S/Inputs/S.c -expression %s
+// RUN: clang-import-test -x objective-c++ -import %S/Inputs/S.m -expression %s
void expr() {
- struct S MyS;
- MyS.a = 3;
+ C *c;
+ int i = [c m];
}
Modified: cfe/trunk/tools/clang-import-test/clang-import-test.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/tools/clang-import-test/clang-import-test.cpp?rev=309014&r1=309013&r2=309014&view=diff
==============================================================================
--- cfe/trunk/tools/clang-import-test/clang-import-test.cpp (original)
+++ cfe/trunk/tools/clang-import-test/clang-import-test.cpp Tue Jul 25 12:54:22 2017
@@ -17,6 +17,7 @@
#include "clang/Basic/TargetInfo.h"
#include "clang/Basic/TargetOptions.h"
#include "clang/CodeGen/ModuleBuilder.h"
+#include "clang/Driver/Types.h"
#include "clang/Frontend/ASTConsumers.h"
#include "clang/Frontend/CompilerInstance.h"
#include "clang/Frontend/MultiplexConsumer.h"
@@ -53,6 +54,11 @@ static llvm::cl::list<std::string>
llvm::cl::desc("Argument to pass to the CompilerInvocation"),
llvm::cl::CommaSeparated);
+static llvm::cl::opt<std::string>
+ Input("x", llvm::cl::Optional,
+ llvm::cl::desc("The language to parse (default: c++)"),
+ llvm::cl::init("c++"));
+
static llvm::cl::opt<bool>
DumpAST("dump-ast", llvm::cl::init(false),
llvm::cl::desc("Dump combined AST"));
@@ -110,6 +116,7 @@ private:
llvm::errs() << LineString << '\n';
llvm::errs().indent(LocColumn);
llvm::errs() << '^';
+ llvm::errs() << '\n';
}
virtual void HandleDiagnostic(DiagnosticsEngine::Level DiagLevel,
@@ -143,7 +150,7 @@ private:
};
std::unique_ptr<CompilerInstance>
-BuildCompilerInstance(ArrayRef<const char *> ClangArgv) {
+BuildCompilerInstance() {
auto Ins = llvm::make_unique<CompilerInstance>();
auto DC = llvm::make_unique<TestDiagnosticConsumer>();
const bool ShouldOwnClient = true;
@@ -151,13 +158,27 @@ BuildCompilerInstance(ArrayRef<const cha
auto Inv = llvm::make_unique<CompilerInvocation>();
+ std::vector<const char *> ClangArgv(ClangArgs.size());
+ std::transform(ClangArgs.begin(), ClangArgs.end(), ClangArgv.begin(),
+ [](const std::string &s) -> const char * { return s.data(); });
CompilerInvocation::CreateFromArgs(*Inv, ClangArgv.data(),
&ClangArgv.data()[ClangArgv.size()],
Ins->getDiagnostics());
- Inv->getLangOpts()->CPlusPlus = true;
- Inv->getLangOpts()->CPlusPlus11 = true;
- Inv->getHeaderSearchOpts().UseLibcxx = true;
+ {
+ using namespace driver::types;
+ ID Id = lookupTypeForTypeSpecifier(Input.c_str());
+ assert(Id != TY_INVALID);
+ if (isCXX(Id)) {
+ Inv->getLangOpts()->CPlusPlus = true;
+ Inv->getLangOpts()->CPlusPlus11 = true;
+ Inv->getHeaderSearchOpts().UseLibcxx = true;
+ }
+ if (isObjC(Id)) {
+ Inv->getLangOpts()->ObjC1 = 1;
+ Inv->getLangOpts()->ObjC2 = 1;
+ }
+ }
Inv->getLangOpts()->Bool = true;
Inv->getLangOpts()->WChar = true;
Inv->getLangOpts()->Blocks = true;
@@ -216,11 +237,8 @@ void AddExternalSource(
}
std::unique_ptr<CompilerInstance> BuildIndirect(std::unique_ptr<CompilerInstance> &CI) {
- std::vector<const char *> ClangArgv(ClangArgs.size());
- std::transform(ClangArgs.begin(), ClangArgs.end(), ClangArgv.begin(),
- [](const std::string &s) -> const char * { return s.data(); });
std::unique_ptr<CompilerInstance> IndirectCI =
- init_convenience::BuildCompilerInstance(ClangArgv);
+ init_convenience::BuildCompilerInstance();
auto ST = llvm::make_unique<SelectorTable>();
auto BC = llvm::make_unique<Builtin::Context>();
std::unique_ptr<ASTContext> AST =
@@ -247,11 +265,8 @@ llvm::Expected<std::unique_ptr<CompilerI
Parse(const std::string &Path,
llvm::ArrayRef<std::unique_ptr<CompilerInstance>> Imports,
bool ShouldDumpAST) {
- std::vector<const char *> ClangArgv(ClangArgs.size());
- std::transform(ClangArgs.begin(), ClangArgs.end(), ClangArgv.begin(),
- [](const std::string &s) -> const char * { return s.data(); });
std::unique_ptr<CompilerInstance> CI =
- init_convenience::BuildCompilerInstance(ClangArgv);
+ init_convenience::BuildCompilerInstance();
auto ST = llvm::make_unique<SelectorTable>();
auto BC = llvm::make_unique<Builtin::Context>();
std::unique_ptr<ASTContext> AST =
More information about the cfe-commits
mailing list