From e4c7e855f118a9f44af46fbd2e6a17c9c1745a21 Mon Sep 17 00:00:00 2001 From: Fariborz Jahanian Date: Fri, 8 Feb 2013 00:27:34 +0000 Subject: [PATCH] objective-C modern translator. Generate #line info in the translated code under -g only. // rdar://13138170 llvm-svn: 174684 --- .../include/clang/Rewrite/Frontend/ASTConsumers.h | 3 +- clang/lib/Rewrite/Frontend/FrontendActions.cpp | 4 ++- clang/lib/Rewrite/Frontend/RewriteModernObjC.cpp | 18 ++++++---- clang/test/Rewriter/line-generation-test.m | 40 ++++++++++++++++++++++ 4 files changed, 56 insertions(+), 9 deletions(-) create mode 100644 clang/test/Rewriter/line-generation-test.m diff --git a/clang/include/clang/Rewrite/Frontend/ASTConsumers.h b/clang/include/clang/Rewrite/Frontend/ASTConsumers.h index c9c92e3..584af3f 100644 --- a/clang/include/clang/Rewrite/Frontend/ASTConsumers.h +++ b/clang/include/clang/Rewrite/Frontend/ASTConsumers.h @@ -35,7 +35,8 @@ ASTConsumer *CreateModernObjCRewriter(const std::string &InFile, raw_ostream *OS, DiagnosticsEngine &Diags, const LangOptions &LOpts, - bool SilenceRewriteMacroWarning); + bool SilenceRewriteMacroWarning, + bool LineInfo); /// CreateHTMLPrinter - Create an AST consumer which rewrites source code to /// HTML with syntax highlighting suitable for viewing in a web-browser. diff --git a/clang/lib/Rewrite/Frontend/FrontendActions.cpp b/clang/lib/Rewrite/Frontend/FrontendActions.cpp index 2e18be9..9935aeb 100644 --- a/clang/lib/Rewrite/Frontend/FrontendActions.cpp +++ b/clang/lib/Rewrite/Frontend/FrontendActions.cpp @@ -158,7 +158,9 @@ ASTConsumer *RewriteObjCAction::CreateASTConsumer(CompilerInstance &CI, if (CI.getLangOpts().ObjCRuntime.isNonFragile()) return CreateModernObjCRewriter(InFile, OS, CI.getDiagnostics(), CI.getLangOpts(), - CI.getDiagnosticOpts().NoRewriteMacros); + CI.getDiagnosticOpts().NoRewriteMacros, + (CI.getCodeGenOpts().getDebugInfo() != + CodeGenOptions::NoDebugInfo)); return CreateObjCRewriter(InFile, OS, CI.getDiagnostics(), CI.getLangOpts(), CI.getDiagnosticOpts().NoRewriteMacros); diff --git a/clang/lib/Rewrite/Frontend/RewriteModernObjC.cpp b/clang/lib/Rewrite/Frontend/RewriteModernObjC.cpp index a3a4afc..68babb4 100644 --- a/clang/lib/Rewrite/Frontend/RewriteModernObjC.cpp +++ b/clang/lib/Rewrite/Frontend/RewriteModernObjC.cpp @@ -163,6 +163,7 @@ namespace { // Needed for header files being rewritten bool IsHeader; bool SilenceRewriteMacroWarning; + bool GenerateLineInfo; bool objc_impl_method; bool DisableReplaceStmt; @@ -224,7 +225,7 @@ namespace { void HandleDeclInMainFile(Decl *D); RewriteModernObjC(std::string inFile, raw_ostream *OS, DiagnosticsEngine &D, const LangOptions &LOpts, - bool silenceMacroWarn); + bool silenceMacroWarn, bool LineInfo); ~RewriteModernObjC() {} @@ -633,9 +634,10 @@ static bool IsHeaderFile(const std::string &Filename) { RewriteModernObjC::RewriteModernObjC(std::string inFile, raw_ostream* OS, DiagnosticsEngine &D, const LangOptions &LOpts, - bool silenceMacroWarn) + bool silenceMacroWarn, + bool LineInfo) : Diags(D), LangOpts(LOpts), InFileName(inFile), OutFile(OS), - SilenceRewriteMacroWarning(silenceMacroWarn) { + SilenceRewriteMacroWarning(silenceMacroWarn), GenerateLineInfo(LineInfo) { IsHeader = IsHeaderFile(inFile); RewriteFailedDiag = Diags.getCustomDiagID(DiagnosticsEngine::Warning, "rewriting sub-expression within a macro (may not be correct)"); @@ -654,8 +656,10 @@ ASTConsumer *clang::CreateModernObjCRewriter(const std::string& InFile, raw_ostream* OS, DiagnosticsEngine &Diags, const LangOptions &LOpts, - bool SilenceRewriteMacroWarning) { - return new RewriteModernObjC(InFile, OS, Diags, LOpts, SilenceRewriteMacroWarning); + bool SilenceRewriteMacroWarning, + bool LineInfo) { + return new RewriteModernObjC(InFile, OS, Diags, LOpts, + SilenceRewriteMacroWarning, LineInfo); } void RewriteModernObjC::InitializeCommon(ASTContext &context) { @@ -1654,7 +1658,7 @@ Stmt *RewriteModernObjC::RewriteBreakStmt(BreakStmt *S) { void RewriteModernObjC::ConvertSourceLocationToLineDirective( SourceLocation Loc, std::string &LineString) { - if (Loc.isFileID()) { + if (Loc.isFileID() && GenerateLineInfo) { LineString += "\n#line "; PresumedLoc PLoc = SM->getPresumedLoc(Loc); LineString += utostr(PLoc.getLine()); @@ -3147,7 +3151,7 @@ void RewriteModernObjC::RewriteLineDirective(const Decl *D) { SourceLocation Location = D->getLocation(); - if (Location.isFileID()) { + if (Location.isFileID() && GenerateLineInfo) { std::string LineString("\n#line "); PresumedLoc PLoc = SM->getPresumedLoc(Location); LineString += utostr(PLoc.getLine()); diff --git a/clang/test/Rewriter/line-generation-test.m b/clang/test/Rewriter/line-generation-test.m new file mode 100644 index 0000000..dad7371 --- /dev/null +++ b/clang/test/Rewriter/line-generation-test.m @@ -0,0 +1,40 @@ +// RUN: %clang_cc1 -E %s -o %t.mm +// RUN: %clang_cc1 -fms-extensions -rewrite-objc -g %t.mm -o %t-rw.cpp +// RUN: FileCheck -check-prefix LINE --input-file=%t-rw.cpp %s +// RUN: %clang_cc1 -fms-extensions -rewrite-objc %t.mm -o %t-rwnog.cpp +// RUN: FileCheck -check-prefix NOLINE --input-file=%t-rwnog.cpp %s +// rdar://13138170 + +__attribute__((objc_root_class)) @interface MyObject { +@public + id _myMaster; + id _isTickledPink; +} +@property(retain) id myMaster; +@property(assign) id isTickledPink; +@end + +@implementation MyObject + +@synthesize myMaster = _myMaster; +@synthesize isTickledPink = _isTickledPink; + +- (void) doSomething { + _myMaster = _isTickledPink; +} + +@end + +MyObject * foo () +{ + MyObject* p; + p.isTickledPink = p.myMaster; // ok + p->_isTickledPink = p->_myMaster; + return p->_isTickledPink; +} + +// CHECK-LINE: #line 22 +// CHECK-LINE: #line 28 +// CHECK-NOLINE-NOT: #line 22 +// CHECK-NOLINE-NOT: #line 28 + -- 2.7.4