Author: jdevlieghere Date: Fri Mar 8 10:33:40 2019 New Revision: 355710 URL: http://llvm.org/viewvc/llvm-project?rev=355710&view=rev Log: [lldb-instr] Support LLDB_RECORD_DUMMY
Extend lldb-instr to insert LLDB_RECORD_DUMMY macros for currently unsupported signatures (void and function pointers). 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=355710&r1=355709&r2=355710&view=diff ============================================================================== --- lldb/trunk/lit/tools/lldb-instr/Inputs/foo.cpp (original) +++ lldb/trunk/lit/tools/lldb-instr/Inputs/foo.cpp Fri Mar 8 10:33:40 2019 @@ -15,3 +15,4 @@ void Foo::G(const char *fmt...) {} Foo Foo::H() { return Foo(); } void Foo::I() const { MACRO_FOO; } Bar Foo::J() const { return MACRO_BAR(Bar()); } +Bar Foo::K(void *v) const { return Bar(); } 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=355710&r1=355709&r2=355710&view=diff ============================================================================== --- lldb/trunk/lit/tools/lldb-instr/Inputs/foo.h (original) +++ lldb/trunk/lit/tools/lldb-instr/Inputs/foo.h Fri Mar 8 10:33:40 2019 @@ -13,4 +13,5 @@ struct Foo { static Foo H(); void I() const; Bar J() const; + Bar K(void *v) const; }; 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=355710&r1=355709&r2=355710&view=diff ============================================================================== --- lldb/trunk/lit/tools/lldb-instr/TestInstrumentationRecord.test (original) +++ lldb/trunk/lit/tools/lldb-instr/TestInstrumentationRecord.test Fri Mar 8 10:33:40 2019 @@ -18,3 +18,5 @@ # CHECK-NOT: LLDB_RECORD_METHOD_CONST_NO_ARGS(void, Foo, I); # CHECK: LLDB_RECORD_METHOD_CONST_NO_ARGS(Bar, Foo, J); # CHECK-NOT: LLDB_RECORD_RESULT(Bar()); +# CHECK: LLDB_RECORD_DUMMY(Bar, Foo, K, (void *), v); +# CHECK-NOT: LLDB_RECORD_RESULT(Bar()); 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=355710&r1=355709&r2=355710&view=diff ============================================================================== --- lldb/trunk/lit/tools/lldb-instr/TestInstrumentationRegister.test (original) +++ lldb/trunk/lit/tools/lldb-instr/TestInstrumentationRegister.test Fri Mar 8 10:33:40 2019 @@ -13,4 +13,5 @@ # CHECK: LLDB_REGISTER_STATIC_METHOD(int, Foo, F, (int)); # CHECK-NOT: LLDB_REGISTER_STATIC_METHOD(void, Foo, G # CHECK-NOT: LLDB_REGISTER_METHOD_CONST(void, Foo, I, ()); +# CHECK-NOT: LLDB_REGISTER_METHOD_CONST(Bar, Foo, K, (void*)); # CHECK: } Modified: lldb/trunk/tools/lldb-instr/Instrument.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/tools/lldb-instr/Instrument.cpp?rev=355710&r1=355709&r2=355710&view=diff ============================================================================== --- lldb/trunk/tools/lldb-instr/Instrument.cpp (original) +++ lldb/trunk/tools/lldb-instr/Instrument.cpp Fri Mar 8 10:33:40 2019 @@ -100,6 +100,19 @@ static std::string GetRecordConstructorM return OS.str(); } +static std::string GetRecordDummyMacro(StringRef Result, StringRef Class, + StringRef Method, StringRef Signature, + StringRef Values) { + assert(!Values.empty()); + std::string Macro; + llvm::raw_string_ostream OS(Macro); + + OS << "LLDB_RECORD_DUMMY(" << Result << ", " << Class << ", " << Method; + OS << ", (" << Signature << "), " << Values << ");\n\n"; + + return OS.str(); +} + static std::string GetRegisterConstructorMacro(StringRef Class, StringRef Signature) { std::string Macro; @@ -170,24 +183,21 @@ public: PrintingPolicy Policy(Context.getLangOpts()); Policy.Bool = true; + // Unsupported signatures get a dummy macro. + bool ShouldInsertDummy = false; + // Collect the functions parameter types and names. std::vector<std::string> ParamTypes; std::vector<std::string> ParamNames; for (auto *P : Decl->parameters()) { QualType T = P->getType(); - - // Currently we don't support functions that have function pointers as an - // argument. - if (T->isFunctionPointerType()) - return false; - - // Currently we don't support functions that have void pointers as an - // argument. - if (T->isVoidPointerType()) - return false; - ParamTypes.push_back(T.getAsString(Policy)); ParamNames.push_back(P->getNameAsString()); + + // Currently we don't support functions that have void pointers or + // function pointers as an argument, in which case we insert a dummy + // macro. + ShouldInsertDummy |= T->isFunctionPointerType() || T->isVoidPointerType(); } // Convert the two lists to string for the macros. @@ -199,7 +209,13 @@ public: // Construct the macros. std::string Macro; - if (isa<CXXConstructorDecl>(Decl)) { + if (ShouldInsertDummy) { + // Don't insert a register call for dummy macros. + Macro = GetRecordDummyMacro( + ReturnType.getAsString(Policy), Record->getNameAsString(), + Decl->getNameAsString(), ParamTypesStr, ParamNamesStr); + + } else if (isa<CXXConstructorDecl>(Decl)) { llvm::outs() << GetRegisterConstructorMacro(Record->getNameAsString(), ParamTypesStr); @@ -229,7 +245,7 @@ public: // If the function returns a class or struct, we need to wrap its return // statement(s). - if (ReturnType->isStructureOrClassType()) { + if (!ShouldInsertDummy && ReturnType->isStructureOrClassType()) { SBReturnVisitor Visitor(MyRewriter); Visitor.TraverseDecl(Decl); } _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits