Add debug flag for printing rewritten C text
authorBrenden Blanco <bblanco@plumgrid.com>
Wed, 9 Sep 2015 05:11:46 +0000 (22:11 -0700)
committerBrenden Blanco <bblanco@plumgrid.com>
Wed, 9 Sep 2015 17:54:59 +0000 (10:54 -0700)
* Many times it is useful to print out the C file after the
  BFrontendAction has run.
  e.g.: BPF("file.c", debug=0x4)

Signed-off-by: Brenden Blanco <bblanco@plumgrid.com>
src/cc/bpf_module.cc
src/cc/frontends/b/loader.cc
src/cc/frontends/b/loader.h
src/cc/frontends/clang/b_frontend_action.cc
src/cc/frontends/clang/b_frontend_action.h
src/cc/frontends/clang/loader.cc
src/cc/frontends/clang/loader.h

index 6738e3a..001419e 100644 (file)
@@ -295,7 +295,7 @@ unique_ptr<ExecutionEngine> BPFModule::finalize_rw(unique_ptr<Module> m) {
 
 // load an entire c file as a module
 int BPFModule::load_cfile(const string &file, bool in_memory) {
-  clang_loader_ = make_unique<ClangLoader>(&*ctx_);
+  clang_loader_ = make_unique<ClangLoader>(&*ctx_, flags_);
   if (clang_loader_->parse(&mod_, &tables_, file, in_memory))
     return -1;
   return 0;
@@ -307,7 +307,7 @@ int BPFModule::load_cfile(const string &file, bool in_memory) {
 // Load in a pre-built list of functions into the initial Module object, then
 // build an ExecutionEngine.
 int BPFModule::load_includes(const string &tmpfile) {
-  clang_loader_ = make_unique<ClangLoader>(&*ctx_);
+  clang_loader_ = make_unique<ClangLoader>(&*ctx_, flags_);
   if (clang_loader_->parse(&mod_, &tables_, tmpfile, false))
     return -1;
   return 0;
@@ -652,7 +652,7 @@ int BPFModule::load_b(const string &filename, const string &proto_filename) {
   if (int rc = load_includes(BCC_INSTALL_PREFIX "/share/bcc/include/bcc/helpers.h"))
     return rc;
 
-  b_loader_.reset(new BLoader);
+  b_loader_.reset(new BLoader(flags_));
   if (int rc = b_loader_->parse(&*mod_, filename, proto_filename, &tables_))
     return rc;
   if (int rc = annotate())
index 8c05193..b26e945 100644 (file)
@@ -27,7 +27,8 @@ using std::vector;
 
 namespace ebpf {
 
-BLoader::BLoader() {
+BLoader::BLoader(unsigned flags) : flags_(flags) {
+  (void)flags_;
 }
 
 BLoader::~BLoader() {
index 772b505..3e3570d 100644 (file)
@@ -35,11 +35,12 @@ class CodegenLLVM;
 
 class BLoader {
  public:
-  BLoader();
+  explicit BLoader(unsigned flags);
   ~BLoader();
   int parse(llvm::Module *mod, const std::string &filename, const std::string &proto_filename,
             std::unique_ptr<std::vector<TableDesc>> *tables);
  private:
+  unsigned flags_;
   std::unique_ptr<cc::Parser> parser_;
   std::unique_ptr<cc::Parser> proto_parser_;
   std::unique_ptr<cc::CodegenLLVM> codegen_;
index 803efa4..cdb51e8 100644 (file)
@@ -442,13 +442,14 @@ bool BTypeConsumer::HandleTopLevelDecl(DeclGroupRef D) {
   return true;
 }
 
-BFrontendAction::BFrontendAction(llvm::raw_ostream &os)
-    : rewriter_(new Rewriter), os_(os), tables_(new vector<TableDesc>) {
+BFrontendAction::BFrontendAction(llvm::raw_ostream &os, unsigned flags)
+    : os_(os), flags_(flags), rewriter_(new Rewriter), tables_(new vector<TableDesc>) {
 }
 
 void BFrontendAction::EndSourceFileAction() {
   // uncomment to see rewritten source
-  //rewriter_->getEditBuffer(rewriter_->getSourceMgr().getMainFileID()).write(llvm::errs());
+  if (flags_ & 0x4)
+    rewriter_->getEditBuffer(rewriter_->getSourceMgr().getMainFileID()).write(llvm::errs());
   rewriter_->getEditBuffer(rewriter_->getSourceMgr().getMainFileID()).write(os_);
   os_.flush();
 }
index b21e72a..aa61638 100644 (file)
@@ -67,7 +67,6 @@ class BTypeVisitor : public clang::RecursiveASTVisitor<BTypeVisitor> {
   bool VisitCallExpr(clang::CallExpr *Call);
   bool VisitVarDecl(clang::VarDecl *Decl);
   bool VisitMemberExpr(clang::MemberExpr *E);
-  bool VisitDeclRefExpr(clang::DeclRefExpr *E);
   bool VisitBinaryOperator(clang::BinaryOperator *E);
   bool VisitImplicitCastExpr(clang::ImplicitCastExpr *E);
 
@@ -96,7 +95,7 @@ class BFrontendAction : public clang::ASTFrontendAction {
  public:
   // Initialize with the output stream where the new source file contents
   // should be written.
-  explicit BFrontendAction(llvm::raw_ostream &os);
+  BFrontendAction(llvm::raw_ostream &os, unsigned flags);
 
   // Called by clang when the AST has been completed, here the output stream
   // will be flushed.
@@ -108,8 +107,9 @@ class BFrontendAction : public clang::ASTFrontendAction {
   // take ownership of the table-to-fd mapping data structure
   std::unique_ptr<std::vector<TableDesc>> take_tables() { return move(tables_); }
  private:
-  std::unique_ptr<clang::Rewriter> rewriter_;
   llvm::raw_ostream &os_;
+  unsigned flags_;
+  std::unique_ptr<clang::Rewriter> rewriter_;
   std::unique_ptr<std::vector<TableDesc>> tables_;
 };
 
index c4ee097..d930faa 100644 (file)
@@ -58,8 +58,8 @@ using std::vector;
 
 namespace ebpf {
 
-ClangLoader::ClangLoader(llvm::LLVMContext *ctx)
-    : ctx_(ctx)
+ClangLoader::ClangLoader(llvm::LLVMContext *ctx, unsigned flags)
+    : ctx_(ctx), flags_(flags)
 {}
 
 ClangLoader::~ClangLoader() {}
@@ -159,7 +159,7 @@ int ClangLoader::parse(unique_ptr<llvm::Module> *mod, unique_ptr<vector<TableDes
   // capture the rewritten c file
   string out_str;
   llvm::raw_string_ostream os(out_str);
-  BFrontendAction bact(os);
+  BFrontendAction bact(os, flags_);
   if (!compiler1.ExecuteAction(bact))
     return -1;
   // this contains the open FDs
index 613cb1d..2f45b64 100644 (file)
@@ -36,12 +36,13 @@ class CodegenLLVM;
 
 class ClangLoader {
  public:
-  explicit ClangLoader(llvm::LLVMContext *ctx);
+  explicit ClangLoader(llvm::LLVMContext *ctx, unsigned flags);
   ~ClangLoader();
   int parse(std::unique_ptr<llvm::Module> *mod, std::unique_ptr<std::vector<TableDesc>> *tables,
             const std::string &file, bool in_memory);
  private:
   llvm::LLVMContext *ctx_;
+  unsigned flags_;
 };
 
 }  // namespace ebpf