Author: jdevlieghere Date: Mon Feb 18 17:04:31 2019 New Revision: 354301 URL: http://llvm.org/viewvc/llvm-project?rev=354301&view=rev Log: [lldb-instr] Wrap returns of struct/classes in LLDB_RECORD_RESULT
The instrumentation framework requires return values of custom classes and structs to be wrapped in the LLDB_RECORD_RESULT macro. Modified: lldb/trunk/lit/tools/lldb-instr/Inputs/foo.cpp lldb/trunk/lit/tools/lldb-instr/Inputs/foo.h lldb/trunk/lit/tools/lldb-instr/TestInstrumentationRecord.test lldb/trunk/lit/tools/lldb-instr/TestInstrumentationRegister.test lldb/trunk/tools/lldb-instr/Instrument.cpp Modified: lldb/trunk/lit/tools/lldb-instr/Inputs/foo.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/lit/tools/lldb-instr/Inputs/foo.cpp?rev=354301&r1=354300&r2=354301&view=diff ============================================================================== --- lldb/trunk/lit/tools/lldb-instr/Inputs/foo.cpp (original) +++ lldb/trunk/lit/tools/lldb-instr/Inputs/foo.cpp Mon Feb 18 17:04:31 2019 @@ -7,3 +7,5 @@ int Foo::C(int i) { return i; } int Foo::D(bool b) const { return 1; } void Foo::E() {} int Foo::F(int i) { return i; } +void Foo::G(const char *fmt...) {} +Foo Foo::H() { return Foo(); } Modified: lldb/trunk/lit/tools/lldb-instr/Inputs/foo.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/lit/tools/lldb-instr/Inputs/foo.h?rev=354301&r1=354300&r2=354301&view=diff ============================================================================== --- lldb/trunk/lit/tools/lldb-instr/Inputs/foo.h (original) +++ lldb/trunk/lit/tools/lldb-instr/Inputs/foo.h Mon Feb 18 17:04:31 2019 @@ -8,5 +8,6 @@ struct Foo { int D(bool b) const; static void E(); static int F(int i); - int G() { return 0; } + void G(const char* fmt...); + static Foo H(); }; Modified: lldb/trunk/lit/tools/lldb-instr/TestInstrumentationRecord.test URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/lit/tools/lldb-instr/TestInstrumentationRecord.test?rev=354301&r1=354300&r2=354301&view=diff ============================================================================== --- lldb/trunk/lit/tools/lldb-instr/TestInstrumentationRecord.test (original) +++ lldb/trunk/lit/tools/lldb-instr/TestInstrumentationRecord.test Mon Feb 18 17:04:31 2019 @@ -12,3 +12,6 @@ # CHECK: LLDB_RECORD_METHOD_CONST(int, Foo, D, (bool), b); # CHECK: LLDB_RECORD_STATIC_METHOD_NO_ARGS(void, Foo, E); # CHECK: LLDB_RECORD_STATIC_METHOD(int, Foo, F, (int), i); +# CHECK-NOT: LLDB_RECORD_STATIC_METHOD(void, Foo, G +# CHECK: LLDB_RECORD_STATIC_METHOD_NO_ARGS(Foo, Foo, H); +# CHECK: LLDB_RECORD_RESULT(Foo()) Modified: lldb/trunk/lit/tools/lldb-instr/TestInstrumentationRegister.test URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/lit/tools/lldb-instr/TestInstrumentationRegister.test?rev=354301&r1=354300&r2=354301&view=diff ============================================================================== --- lldb/trunk/lit/tools/lldb-instr/TestInstrumentationRegister.test (original) +++ lldb/trunk/lit/tools/lldb-instr/TestInstrumentationRegister.test Mon Feb 18 17:04:31 2019 @@ -10,3 +10,4 @@ # CHECK: LLDB_REGISTER_METHOD_CONST(int, Foo, D, (bool)); # CHECK: LLDB_REGISTER_STATIC_METHOD(void, Foo, E, ()); # CHECK: LLDB_REGISTER_STATIC_METHOD(int, Foo, F, (int)); +# CHECK-NOT: LLDB_REGISTER_STATIC_METHOD(void, Foo, G Modified: lldb/trunk/tools/lldb-instr/Instrument.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/lldb-instr/Instrument.cpp?rev=354301&r1=354300&r2=354301&view=diff ============================================================================== --- lldb/trunk/tools/lldb-instr/Instrument.cpp (original) +++ lldb/trunk/tools/lldb-instr/Instrument.cpp Mon Feb 18 17:04:31 2019 @@ -120,6 +120,33 @@ static std::string GetRegisterMethodMacr return OS.str(); } +class SBReturnVisitor : public RecursiveASTVisitor<SBReturnVisitor> { +public: + SBReturnVisitor(Rewriter &R) : MyRewriter(R) {} + + bool VisitReturnStmt(ReturnStmt *Stmt) { + Expr *E = Stmt->getRetValue(); + + if (E->getBeginLoc().isMacroID()) + return false; + + SourceRange R(E->getBeginLoc(), E->getEndLoc()); + + StringRef WrittenExpr = Lexer::getSourceText( + CharSourceRange::getTokenRange(R), MyRewriter.getSourceMgr(), + MyRewriter.getLangOpts()); + + std::string ReplacementText = + "LLDB_RECORD_RESULT(" + WrittenExpr.str() + ")"; + MyRewriter.ReplaceText(R, ReplacementText); + + return true; + } + +private: + Rewriter &MyRewriter; +}; + class SBVisitor : public RecursiveASTVisitor<SBVisitor> { public: SBVisitor(Rewriter &R, ASTContext &Context) @@ -200,6 +227,13 @@ public: MyRewriter.getLangOpts()); MyRewriter.InsertTextAfter(InsertLoc, Macro); + // If the function returns a class or struct, we need to wrap its return + // statement(s). + if (ReturnType->isStructureOrClassType()) { + SBReturnVisitor Visitor(MyRewriter); + Visitor.TraverseDecl(Decl); + } + return true; } @@ -210,8 +244,9 @@ private: /// 1. Decls outside the main source file, /// 2. Decls that are only present in the source file, /// 3. Decls that are not definitions, - /// 4. Non-public decls, - /// 5. Destructors. + /// 4. Non-public methods, + /// 5. Variadic methods. + /// 6. Destructors. bool ShouldSkip(CXXMethodDecl *Decl) { // Skip anything outside the main file. if (!MyRewriter.getSourceMgr().isInMainFile(Decl->getBeginLoc())) @@ -228,11 +263,15 @@ private: if (!Body) return true; - // Skip non-public decls. + // Skip non-public methods. AccessSpecifier AS = Decl->getAccess(); if (AS != AccessSpecifier::AS_public) return true; + // Skip variadic methods. + if (Decl->isVariadic()) + return true; + // Skip destructors. if (isa<CXXDestructorDecl>(Decl)) return true; _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits