aaboud added reviewers: erichkeane, bwyma.
aaboud updated this revision to Diff 65551.
aaboud added a comment.

Updated patch to top of trunk (r276746) - Thanks to Ranjeet Singh.

Please, provide your feedback.


https://reviews.llvm.org/D16135

Files:
  include/clang/AST/ASTConsumer.h
  lib/AST/ASTConsumer.cpp
  lib/CodeGen/CGDebugInfo.cpp
  lib/CodeGen/CGDebugInfo.h
  lib/CodeGen/CMakeLists.txt
  lib/CodeGen/CodeGenAction.cpp
  lib/CodeGen/CodeGenModule.cpp
  lib/CodeGen/CodeGenModule.h
  lib/CodeGen/ModuleBuilder.cpp
  lib/Parse/ParseAST.cpp

Index: lib/Parse/ParseAST.cpp
===================================================================
--- lib/Parse/ParseAST.cpp
+++ lib/Parse/ParseAST.cpp
@@ -127,6 +127,12 @@
       new Parser(S.getPreprocessor(), S, SkipFunctionBodies));
   Parser &P = *ParseOP.get();
 
+  std::unique_ptr<PPCallbacks> Callbacks =
+      Consumer->CreatePreprocessorCallbacks(S.getPreprocessor());
+  if (Callbacks) {
+    S.getPreprocessor().addPPCallbacks(std::move(Callbacks));
+  }
+
   llvm::CrashRecoveryContextCleanupRegistrar<const void, ResetStackCleanup>
       CleanupPrettyStack(llvm::SavePrettyStackState());
   PrettyStackTraceParserEntry CrashInfo(P);
Index: lib/CodeGen/ModuleBuilder.cpp
===================================================================
--- lib/CodeGen/ModuleBuilder.cpp
+++ lib/CodeGen/ModuleBuilder.cpp
@@ -20,6 +20,7 @@
 #include "clang/Basic/Diagnostic.h"
 #include "clang/Basic/TargetInfo.h"
 #include "clang/Frontend/CodeGenOptions.h"
+#include "clang/Lex/PPCallbacks.h"
 #include "llvm/ADT/StringRef.h"
 #include "llvm/IR/DataLayout.h"
 #include "llvm/IR/LLVMContext.h"
@@ -130,6 +131,11 @@
         Builder->AppendLinkerOptions(Opt);
     }
 
+    std::unique_ptr<PPCallbacks>
+    CreatePreprocessorCallbacks(Preprocessor &PP) override {
+      return Builder->createPreprocessorCallbacks(PP);
+    }
+
     void HandleCXXStaticMemberVarInstantiation(VarDecl *VD) override {
       if (Diags.hasErrorOccurred())
         return;
Index: lib/CodeGen/CodeGenModule.cpp
===================================================================
--- lib/CodeGen/CodeGenModule.cpp
+++ lib/CodeGen/CodeGenModule.cpp
@@ -25,6 +25,7 @@
 #include "CodeGenPGO.h"
 #include "CodeGenTBAA.h"
 #include "CoverageMappingGen.h"
+#include "MacroPPCallbacks.h"
 #include "TargetInfo.h"
 #include "clang/AST/ASTContext.h"
 #include "clang/AST/CharUnits.h"
@@ -204,6 +205,16 @@
   CUDARuntime.reset(CreateNVCUDARuntime(*this));
 }
 
+std::unique_ptr<PPCallbacks>
+CodeGenModule::createPreprocessorCallbacks(Preprocessor &PP) {
+  // Enable generating macro debug info only in FullDebugInfo mode.
+  if (CodeGenOpts.getDebugInfo() < codegenoptions::FullDebugInfo ||
+      !getModuleDebugInfo())
+    return nullptr;
+
+  return llvm::make_unique<MacroPPCallbacks>(*getModuleDebugInfo(), PP);
+}
+
 void CodeGenModule::addReplacement(StringRef Name, llvm::Constant *C) {
   Replacements[Name] = C;
 }
Index: lib/CodeGen/CMakeLists.txt
===================================================================
--- lib/CodeGen/CMakeLists.txt
+++ lib/CodeGen/CMakeLists.txt
@@ -73,6 +73,7 @@
   CodeGenTypes.cpp
   CoverageMappingGen.cpp
   ItaniumCXXABI.cpp
+  MacroPPCallbacks.cpp
   MicrosoftCXXABI.cpp
   ModuleBuilder.cpp
   ObjectFilePCHContainerOperations.cpp
Index: lib/CodeGen/CGDebugInfo.h
===================================================================
--- lib/CodeGen/CGDebugInfo.h
+++ lib/CodeGen/CGDebugInfo.h
@@ -386,6 +386,16 @@
 
   void completeTemplateDefinition(const ClassTemplateSpecializationDecl &SD);
 
+  /// Get Macro debug info.
+  llvm::DIMacro *CreateMacro(llvm::DIMacroFile *Parent, unsigned MType,
+                             SourceLocation LineLoc, StringRef Name,
+                             StringRef Value);
+
+  /// Get Macro File debug info.
+  llvm::DIMacroFile *CreateMacroFile(llvm::DIMacroFile *Parent,
+                                     SourceLocation LineLoc,
+                                     SourceLocation FileLoc);
+
 private:
   /// Emit call to llvm.dbg.declare for a variable declaration.
   void EmitDeclare(const VarDecl *decl, llvm::Value *AI,
Index: lib/CodeGen/CodeGenAction.cpp
===================================================================
--- lib/CodeGen/CodeGenAction.cpp
+++ lib/CodeGen/CodeGenAction.cpp
@@ -222,6 +222,11 @@
       Gen->HandleVTable(RD);
     }
 
+    std::unique_ptr<PPCallbacks>
+    CreatePreprocessorCallbacks(Preprocessor &PP) override {
+      return Gen->CreatePreprocessorCallbacks(PP);
+    }
+
     static void InlineAsmDiagHandler(const llvm::SMDiagnostic &SM,void *Context,
                                      unsigned LocCookie) {
       SourceLocation Loc = SourceLocation::getFromRawEncoding(LocCookie);
Index: lib/CodeGen/CGDebugInfo.cpp
===================================================================
--- lib/CodeGen/CGDebugInfo.cpp
+++ lib/CodeGen/CGDebugInfo.cpp
@@ -2264,6 +2264,22 @@
                                         FullName);
 }
 
+llvm::DIMacro *CGDebugInfo::CreateMacro(llvm::DIMacroFile *Parent,
+                                        unsigned MType, SourceLocation LineLoc,
+                                        StringRef Name, StringRef Value) {
+  unsigned Line = LineLoc.isInvalid() ? 0 : getLineNumber(LineLoc);
+  return DBuilder.createMacro(Parent, Line, MType, Name, Value);
+}
+
+llvm::DIMacroFile *CGDebugInfo::CreateMacroFile(llvm::DIMacroFile *Parent,
+                                                SourceLocation LineLoc,
+                                                SourceLocation FileLoc) {
+  llvm::DIFile *FName = getOrCreateFile(FileLoc);
+  unsigned Line = LineLoc.isInvalid() ? 0 : getLineNumber(LineLoc);
+  return DBuilder.createMacroFile(Parent, Line, FName,
+                                  llvm::DIMacroNodeArray());
+}
+
 static QualType UnwrapTypeForDebugInfo(QualType T, const ASTContext &C) {
   Qualifiers Quals;
   do {
Index: lib/CodeGen/CodeGenModule.h
===================================================================
--- lib/CodeGen/CodeGenModule.h
+++ lib/CodeGen/CodeGenModule.h
@@ -77,6 +77,8 @@
 class CXXDestructorDecl;
 class Module;
 class CoverageSourceInfo;
+class Preprocessor;
+class PPCallbacks;
 
 namespace CodeGen {
 
@@ -591,6 +593,8 @@
 
   CGDebugInfo *getModuleDebugInfo() { return DebugInfo.get(); }
 
+  std::unique_ptr<PPCallbacks> createPreprocessorCallbacks(Preprocessor &PP);
+
   llvm::MDNode *getNoObjCARCExceptionsMetadata() {
     if (!NoObjCARCExceptionsMetadata)
       NoObjCARCExceptionsMetadata = llvm::MDNode::get(getLLVMContext(), None);
Index: lib/AST/ASTConsumer.cpp
===================================================================
--- lib/AST/ASTConsumer.cpp
+++ lib/AST/ASTConsumer.cpp
@@ -14,6 +14,7 @@
 #include "clang/AST/ASTConsumer.h"
 #include "clang/AST/Decl.h"
 #include "clang/AST/DeclGroup.h"
+#include "clang/Lex/PPCallbacks.h"
 using namespace clang;
 
 bool ASTConsumer::HandleTopLevelDecl(DeclGroupRef D) {
@@ -29,3 +30,9 @@
 void ASTConsumer::HandleImplicitImportDecl(ImportDecl *D) {
   HandleTopLevelDecl(DeclGroupRef(D));
 }
+
+std::unique_ptr<PPCallbacks>
+
+ASTConsumer::CreatePreprocessorCallbacks(Preprocessor &PP) {
+  return nullptr;
+}
Index: include/clang/AST/ASTConsumer.h
===================================================================
--- include/clang/AST/ASTConsumer.h
+++ include/clang/AST/ASTConsumer.h
@@ -14,6 +14,8 @@
 #ifndef LLVM_CLANG_AST_ASTCONSUMER_H
 #define LLVM_CLANG_AST_ASTCONSUMER_H
 
+#include <memory>
+
 namespace clang {
   class ASTContext;
   class CXXMethodDecl;
@@ -27,6 +29,8 @@
   class VarDecl;
   class FunctionDecl;
   class ImportDecl;
+  class PPCallbacks;
+  class Preprocessor;
 
 /// ASTConsumer - This is an abstract interface that should be implemented by
 /// clients that read ASTs.  This abstraction layer allows the client to be
@@ -139,6 +143,12 @@
   /// body may be parsed anyway if it is needed (for instance, if it contains
   /// the code completion point or is constexpr).
   virtual bool shouldSkipFunctionBody(Decl *D) { return true; }
+
+  /// If the consumer is interested in notifications from Preprocessor,
+  /// for example: notifications on macro definitions, etc., it should return
+  /// a pointer to a PPCallbacks here.
+  /// The caller takes ownership on the returned pointer.
+  virtual std::unique_ptr<PPCallbacks> CreatePreprocessorCallbacks(Preprocessor &PP);
 };
 
 } // end namespace clang.
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to