2401llvm,clang的libtooling

这篇具有很好参考价值的文章主要介绍了2401llvm,clang的libtooling。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

LibTooling(库工具)

LibTooling是个支持基于Clang编写独立工具的库.
在此,为LLVM安装Clang工具

介绍

LibTooling构建的工具(如Clang插件)通过代码运行FrontendActions.
这里演示运行Clang的快速检查一堆代码语法SyntaxOnlyAction的不同方法.

解析内存中的代码片

如果想对,如对ClangAST的某些部分单元测试代码运行FrontendAction,则runToolOnCode就是你找的.如:

#include "clang/Tooling/Tooling.h"
TEST(runToolOnCode, CanSyntaxCheckCode) {
  //`runToolOnCode`返回在给定代码上是否正确`操作`运行.
  EXPECT_TRUE(runToolOnCode(std::make_unique<clang::SyntaxOnlyAction>(), "class X {};"));
}

编写独立工具

一旦对FrontendAction运行了单元测试,使其不可中断,就可创建独立工具了.作为独立运行clang的工具,首先要确定要为指定文件使用哪些命令行参数.

为此,创建了一个编译数据库.有很多种创建编译数据库的方法,可根据命令行选项来支持所有这些方法.
CommonOptionsParser类,负责解析与编译数据库和输入相关的命令行参数,以便所有工具可共享实现.

解析常用工具选项

可从构建目录命令行读取编译数据库.使用CommonOptionsParser显式指定编译命令行,用-p命令行选项指定构建路径,及用源文件路径自动定位编译数据库.

#include "clang/Tooling/CommonOptionsParser.h"
#include "llvm/Support/CommandLine.h"
using namespace clang::tooling;
//对`所有命令行选项`,应用自定义分类,以便只显示他们.
static llvm::cl::OptionCategory MyToolCategory("my-tool options");
int main(int argc, const char **argv) {
   //`CommonOptionsParser`构造器解析参数,并创建`编译数据库`.如果出现错误,它终止程序.
 
  CommonOptionsParser OptionsParser(argc, argv, MyToolCategory);
  //使用`OptionsParser.getCompilations()`和`OptionsParser.getSourcePathList()`提取`编译数据库`和输入文件路径列表.
}

创建并运行ClangTool

一旦有了编译数据库,就可创建一个ClangTool并在一些代码上运行FrontendAction.如,要对"a.cc""b.cc"文件运行SyntaxOnlyAction,可这样写:

//可在同一进程中运行多个源的`clang`工具.
std::vector<std::string> Sources;
Sources.push_back("a.cc");
Sources.push_back("b.cc");
//把创建的`编译数据库`和要运行的`源码`交给`工具构造器`.
ClangTool Tool(OptionsParser.getCompilations(), Sources);
//`ClangTool`要为运行的每个`翻译单元`提供一个新的`FrontendAction`.因此,它以`FrontendActionFactory`作为参数.
//要从给定的`FrontendAction`类型创建`FrontendActionFactory`,调用`newFrontendActionFactory<clang::SyntaxOnlyAction>()`.
int result = Tool.run(newFrontendActionFactory<clang::SyntaxOnlyAction>().get());

组合在一起,第一个工具

现在,合并前面两个步骤到第一个实际工具中.此例工具更高级版本也签入到tools/clang-check/ClangCheck.cppclang树中.

//声明`clang::SyntaxOnlyAction`.
#include "clang/Frontend/FrontendActions.h"
#include "clang/Tooling/CommonOptionsParser.h"
#include "clang/Tooling/Tooling.h"
//声明`llvm::cl::extrahelp`.
#include "llvm/Support/CommandLine.h"

using namespace clang::tooling;
using namespace llvm;
static cl::OptionCategory MyToolCategory("my-tool options");
static cl::extrahelp CommonHelp(CommonOptionsParser::HelpMessage);
//之后可添加此指定工具的帮助消息.
static cl::extrahelp MoreHelp("\nMore help text...\n");
int main(int argc, const char **argv) {
  CommonOptionsParser OptionsParser(argc, argv, MyToolCategory);
  ClangTool Tool(OptionsParser.getCompilations(), OptionsParser.getSourcePathList());
  return Tool.run(newFrontendActionFactory<clang::SyntaxOnlyAction>().get());
}

在某些代码上运行该工具

检出并构建clang时,已构建``clang-check,并在构建目录中的bin/clang-check中.

可通过在"--"分隔符后,指定``llvm仓库中的文件运行clang-check所有必需参数:

$ cd /path/to/source/llvm
$ export BD=/path/to/build/llvm
$ $BD/bin/clang-check tools/clang/tools/clang-check/ClangCheck.cpp -- \
      clang++ -D__STDC_CONSTANT_MACROS -D__STDC_LIMIT_MACROS \
      -Itools/clang/include -I$BD/include -Iinclude \
      -Itools/clang/lib/Headers -c

或,还可按把编译命令数据库输出到其构建目录中,来配置cmake:

# 或从UI设置CMAKE_EXPORT_COMPILE_COMMANDS.
$ cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON .

这在目录中创建叫compile_commands.json的文件.现在,你可通过按第一个参数指定构建路径,并按进一步的位置参数指定一些源文件,来对项目中的文件运行clang-check:

$ cd /path/to/source/llvm
$ export BD=/path/to/build/llvm
$ $BD/bin/clang-check -p $BD tools/clang/tools/clang-check/ClangCheck.cpp

内置包含

Clang工具需要其内置头文件,并按Clang方式搜索它们.因此,默认在$(dirname/path/to/tool)/中查找内置头文件.

相对工具二进制文件的/lib/clang/3.3/include.对在构建clang-resource-headers后,从llvm的顶级二进制目录运行的工具,或如果该工具clang二进制文件旁边的clang安装的二进制目录运行,则开箱即用.

提示:如果工具找不到stddef.h或类似头文件,请使用-v调用该工具并查看它所查找的搜索路径.

连接

有关要链接的库列表,请查看工具的CMake文件之一(如clang-check/CMakeList.txt)这里.文章来源地址https://www.toymoban.com/news/detail-817155.html

到了这里,关于2401llvm,clang的libtooling的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用 LLVM clang C/C++ 编译器编译 OpenSSL 3.X库

    1、下载 OpenSSL 3.X 库的源代码放到待编译目录 2、解压并接入 OpenSSL 3.X 库源码的根目录 3、复制 ./Configure 一个取名为 ./Configure-clang 4、修改 ./Configure-clang 找到配置段: CC= CXX= CPP= LD= 把它们改成 CC          = \\\"/usr/bin/clang-8\\\", CXX         = \\\"/usr/bin/clang++-8\\\", CPP         = \\\"/usr/bin/

    2024年02月02日
    浏览(36)
  • github, git, google: clang-前端插件-给各种无花括号的“块”加花括号-基于llvm15--clang-plugin-add-brace-----google镜像

    术语约定或备忘 case起止范围: 从冒号到下一个’case’开头, 简称有: case内 、case内容 Ast: Abstract syntax tree: 抽象语法树 没插入花括号的case 若case内, 以下任一条成立,则 跳过该case 即 不会对该case内容用花括号包裹. 有#define、 有#include、 有直属变量声明、 空case、 有宏调用

    2024年02月05日
    浏览(40)
  • warning: remember to run ‘libtool --finish /usr/local/1/php-7.4.29/libs

    ubuntu上php7.4.33编译安装完成后警告报错,如下所示   # /usr/local/apache2/apr/build-1/libtool --finish /usr/local/soft/php-7.4.33/libs # vim /etc/ld.so.conf.d/local.conf   /usr/local/lib /usr/lib64 # ldconfig 或者安装依赖服务,重新编译 # apt install -y libtool # make make install

    2024年02月13日
    浏览(39)
  • 2401vim,vim标号

    提供高亮,快速告诉用户 有用信息 .如,调试器在 左侧列 中有个 表示断点 的图标. 另一例可能是表示 (PC) 程序计数器的箭头.标号功能允许在 窗口左侧 放置 标号或图标 ,并定义应用行的 高亮 . 此外,调试器还支持8到 10 种不同的 标号和高亮 颜色,见 |NetBeans| . 使用 标号 有两个步

    2024年01月21日
    浏览(33)
  • 2401编辑器,好插件

    原文 CScintillaCtrl,CScintillaView 和 CScintillaDocv1.82 Scintilla 编辑控件的免费 MFC 和 ATL/WTL 包装类 这些类为 Scintilla 编辑控件 (http://www.scintilla.org) 提供 MFC 和 ATL/WTL 包装. 此控件 提供 开源 跨平台 编辑控件 . 部分功能包括 语法高亮 , 调用提示 , 括号高亮 , 风格,边距和标记 等等.提供的

    2024年02月03日
    浏览(37)
  • SIP-2401VP SIP音频广播模块SIP-2401VP SIP号角音柱音箱解码poe广播播放核心板

    SV-2401VP 和 SV-2403VP 网络音频模块是一款通用的独立SIP音频功能模块,可以轻松地嵌入到OEM产品中。该模块对来自网络的SIP协议及RTP音频流进行编解码。 该模块支持多种网络协议和音频编解码协议,可用于VoIP和IP寻呼以及高质量音乐流媒体播放等应用。同时, SV-2403VP 还提供两

    2024年02月03日
    浏览(33)
  • 2401vim,vim实现任务列表

    功能很简单,就是 回车 执行, F8 切换背景颜色. 主要在 标号.vim 里面实现,用了几个变量: 利用 标号 来高亮行.在 vimrc 中加入 进入与离开 缓冲 时执行. 在 E:Vim路径syntax 中加入颜色: 任务列表 ,可以切换颜色,表示是否完成 任务 . 可以做成个 待办列表 ,是个非常实现的功能!

    2024年01月15日
    浏览(18)
  • 2401C++,C++编译时自动加密

    编译时加密串,运行时 动态解密 .此自定义 加密算法 可增加破解的难度,因为攻击者不仅需要 逆向工程代码 ,还需要理解 加密算法 . 这样对代码的改动小,不影响代码可读性. 下面是使用 boost.hana 编译时 加密 串的示例: 开发环境 :Windows11,VS202217.8.4,Boost1.84,C++17,C++20 用记事本打开

    2024年01月21日
    浏览(25)
  • LeetCode 2401.最长优雅子数组 ----双指针+位运算

    数据范围1e5 考虑nlog 或者n的解法,考虑双指针 因为这里要求的是一段连续的数组 想起我们的最长不重复连续子序列 然后结合一下位运算就好了 是一道双指针不错的题目

    2024年02月06日
    浏览(29)
  • LLVM系列(1): 在微软Visual Studio下编译LLVM

    参考链接: Getting Started with the LLVM System using Microsoft Visual Studio — LLVM 18.0.0git documentation 1.安装visualstudio,版本需要大于vs2019 本机环境已安装visual studio2022,省略 2安装Makefile,版本需要大于3.21 本机环境已经安装cmake3.26 3. 用Cmake配置llvm 4.编译LLVM(有多个选项,例如选release,可

    2024年01月16日
    浏览(25)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包