<div dir="ltr"><span style="font-size:12.8px">Hi everyone,</span><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">I want to add some extra parameters for all CUDA kernel functions (any function that has the __global__ attribute) inside a CUDA source file. For example, I have a function called matrixAddCUDA which was originally declared like this:</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px"><div>__global__ void</div><div>matrixAddCUDA(float *C, float *A, float *B, int w, int h)</div><div>{</div></div><div style="font-size:12.8px">    // code inside the function......</div><div style="font-size:12.8px">}</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">I want to use the Rewriter to add some extra parameters so that the function will be like this:</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px"><div>__global__ void</div><div>matrixAddCUDA(float *C, float *A, float *B, int w, int h, <b>int extra1, int extra2, int extra3</b>)</div><div>{</div></div><div style="font-size:12.8px">    // code inside the function</div><div style="font-size:12.8px">}</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">My current implementation is:</div><div style="font-size:12.8px"><div>#include <iostream></div><div>#include <string></div><div><br></div><div>#include "clang/AST/AST.h"</div><div>#include "clang/AST/ASTConsumer.h"</div><div>#include "clang/ASTMatchers/<wbr>ASTMatchFinder.h"</div><div>#include "clang/ASTMatchers/<wbr>ASTMatchers.h"</div><div>#include "clang/Frontend/<wbr>CompilerInstance.h"</div><div>#include "clang/Frontend/<wbr>FrontendActions.h"</div><div>#include "clang/Rewrite/Core/Rewriter.<wbr>h"</div><div>#include "clang/Tooling/<wbr>CommonOptionsParser.h"</div><div>#include "clang/Tooling/Tooling.h"</div><div>#include "llvm/Support/raw_ostream.h"</div><div><br></div><div>using namespace clang::tooling;</div><div>using namespace llvm;</div><div>using namespace clang;</div><div>using namespace clang::ast_matchers;</div><div><br></div><div><br></div><div>// Apply a custom category to all command-line options so that they are the</div><div>// only ones displayed.</div><div>static llvm::cl::OptionCategory MyToolCategory("my-tool options");</div><div><br></div><div>// CommonOptionsParser declares HelpMessage with a description of the common</div><div>// command-line options related to the compilation database and input files.</div><div>// It's nice to have this help message in all tools.</div><div>static cl::extrahelp CommonHelp(<wbr>CommonOptionsParser::<wbr>HelpMessage);</div><div><br></div><div>// A help message for this specific tool can be added afterwards.</div><div>static cl::extrahelp MoreHelp("\nMore help text...");</div><div><br></div><div><br></div><div>class MyASTConsumer: public ASTConsumer {</div><div>public:</div><div><span class="gmail-m_-1858397078145833216gmail-Apple-tab-span" style="white-space:pre-wrap">     </span>Rewriter &TheRewriter;</div><div><span class="gmail-m_-1858397078145833216gmail-Apple-tab-span" style="white-space:pre-wrap">    </span>MyASTConsumer (Rewriter &R) : TheRewriter(R){}</div><div><span class="gmail-m_-1858397078145833216gmail-Apple-tab-span" style="white-space:pre-wrap">    </span>void HandleTranslationUnit(<wbr>ASTContext &Context) override {</div><div><span class="gmail-m_-1858397078145833216gmail-Apple-tab-span" style="white-space:pre-wrap">             </span>// Run the matchers when we have the whole TU parsed.</div><div><span class="gmail-m_-1858397078145833216gmail-Apple-tab-span" style="white-space:pre-wrap">         </span>Finder.matchAST(Context);</div><div><span class="gmail-m_-1858397078145833216gmail-Apple-tab-span" style="white-space:pre-wrap">             </span></div><div><span class="gmail-m_-1858397078145833216gmail-Apple-tab-span" style="white-space:pre-wrap">              </span>for(DeclContext::decl_iterator D = Context.<wbr>getTranslationUnitDecl()-><wbr>decls_begin(), DEnd = Context.<wbr>getTranslationUnitDecl()-><wbr>decls_end(); D!=DEnd; ++D){</div><div><span class="gmail-m_-1858397078145833216gmail-Apple-tab-span" style="white-space:pre-wrap">                    </span>FunctionDecl* FD; </div><div><span class="gmail-m_-1858397078145833216gmail-Apple-tab-span" style="white-space:pre-wrap">                   </span>if((FD=dyn_cast<FunctionDecl> (*D)) != 0){</div><div><span class="gmail-m_-1858397078145833216gmail-Apple-tab-span" style="white-space:pre-wrap">                              </span>if(FD->hasAttr<CUDAGlobalAttr><wbr>()){ </div><div><span class="gmail-m_-1858397078145833216gmail-Apple-tab-span" style="white-space:pre-wrap">                                      </span>std::cout << "found " << FD->getNameAsString() << " fun decl\n";</div><div><span class="gmail-m_-1858397078145833216gmail-Apple-tab-span" style="white-space:pre-wrap">                                     </span>TypeSourceInfo *TI = FD->getTypeSourceInfo();</div><div><span class="gmail-m_-1858397078145833216gmail-Apple-tab-span" style="white-space:pre-wrap">                                      </span>TypeLoc TL = TI->getTypeLoc();</div><div><span class="gmail-m_-1858397078145833216gmail-Apple-tab-span" style="white-space:pre-wrap">                                     </span>FunctionTypeLoc FTL = TL.getAsAdjusted<<wbr>FunctionTypeLoc>();</div><div><span class="gmail-m_-1858397078145833216gmail-Apple-tab-span" style="white-space:pre-wrap">                                   </span>TheRewriter.insertText(FTL.<wbr>getRParenLoc(), "int extra1, int extra2, int extra3", true, true);</div><div><span class="gmail-m_-1858397078145833216gmail-Apple-tab-span" style="white-space:pre-wrap">                            </span>}</div><div><span class="gmail-m_-1858397078145833216gmail-Apple-tab-span" style="white-space:pre-wrap">                     </span>}</div><div><br></div><div><span class="gmail-m_-1858397078145833216gmail-Apple-tab-span" style="white-space:pre-wrap">            </span>}</div><div><span class="gmail-m_-1858397078145833216gmail-Apple-tab-span" style="white-space:pre-wrap">             </span></div><div><span class="gmail-m_-1858397078145833216gmail-Apple-tab-span" style="white-space:pre-wrap">      </span>}</div><div><br></div><div>private:</div><div><span class="gmail-m_-1858397078145833216gmail-Apple-tab-span" style="white-space:pre-wrap">     </span>MatchFinder Finder;</div><div>};</div><div><br></div><div>// For each source file provided to the tool, a new FrontendAction is created.</div><div>class MyFrontendAction : public ASTFrontendAction {</div><div>public:</div><div><span class="gmail-m_-1858397078145833216gmail-Apple-tab-span" style="white-space:pre-wrap">    </span>MyFrontendAction() {}</div><div><span class="gmail-m_-1858397078145833216gmail-Apple-tab-span" style="white-space:pre-wrap"> </span>void EndSourceFileAction() override {</div><div><span class="gmail-m_-1858397078145833216gmail-Apple-tab-span" style="white-space:pre-wrap">         </span>TheRewriter.getEditBuffer(<wbr>TheRewriter.getSourceMgr().<wbr>getMainFileID())</div><div><span class="gmail-m_-1858397078145833216gmail-Apple-tab-span" style="white-space:pre-wrap">           </span>.write(llvm::outs());</div><div><span class="gmail-m_-1858397078145833216gmail-Apple-tab-span" style="white-space:pre-wrap"> </span>}</div><div><br></div><div><span class="gmail-m_-1858397078145833216gmail-Apple-tab-span" style="white-space:pre-wrap">    </span>std::unique_ptr<ASTConsumer> CreateASTConsumer(<wbr>CompilerInstance &CI,</div><div><span class="gmail-m_-1858397078145833216gmail-Apple-tab-span" style="white-space:pre-wrap">     </span>StringRef file) override {</div><div><span class="gmail-m_-1858397078145833216gmail-Apple-tab-span" style="white-space:pre-wrap">            </span>TheRewriter.setSourceMgr(CI.<wbr>getSourceManager(), CI.getLangOpts());</div><div><span class="gmail-m_-1858397078145833216gmail-Apple-tab-span" style="white-space:pre-wrap">         </span>return llvm::make_unique<<wbr>MyASTConsumer>(TheRewriter);</div><div><span class="gmail-m_-1858397078145833216gmail-Apple-tab-span" style="white-space:pre-wrap">        </span>}</div><div><br></div><div>private:</div><div><span class="gmail-m_-1858397078145833216gmail-Apple-tab-span" style="white-space:pre-wrap">     </span>Rewriter TheRewriter;</div><div>};</div><div><br></div><div><br></div><div>int main(int argc, const char **argv) {</div><div><span class="gmail-m_-1858397078145833216gmail-Apple-tab-span" style="white-space:pre-wrap">        </span>CommonOptionsParser OptionsParser(argc, argv, MyToolCategory);</div><div><span class="gmail-m_-1858397078145833216gmail-Apple-tab-span" style="white-space:pre-wrap">        </span>ClangTool Tool(OptionsParser.<wbr>getCompilations(),</div><div><span class="gmail-m_-1858397078145833216gmail-Apple-tab-span" style="white-space:pre-wrap">    </span>OptionsParser.<wbr>getSourcePathList());</div><div><br></div><div><span class="gmail-m_-1858397078145833216gmail-Apple-tab-span" style="white-space:pre-wrap">       </span>return Tool.run(<wbr>newFrontendActionFactory<<wbr>MyFrontendAction>().get());</div><div>}</div></div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">It can successfully print out the CUDA kernel function, but cannot add extra parameters. I think there must be some problems with the Rewriter, but I don't know where.</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">Thanks in advance!</div><div style="font-size:12.8px"><br></div><div style="font-size:12.8px">Patrick</div></div>