有什么方法可以获得llvm deference指针值的原始类型(即指针类型)吗?
也许标题以某种方式感到困惑.但是让我举一个例子. void foo(int val) { // do something } int i = 27; int* pi = &i; foo(*pi); 在这里,如果我们使用clang对其进行编译,则 *pi的类型为i32,但我们知道PI是指针类型. 我的问题是我们使用函数:: getGetFunctionParamType方法,结果将是i32.但是,如何使用某种方法来获取" Pi"类型,而不是" *pi"类型?这个问题使我几天感到困惑. 更新: 我看到有人混淆了这个问题.好吧,我已经将此源代码编译到LLVM中间格式FLIE(即.因此(现在没有int,int*).而且我不想构造一种指针类型,我只想以某种方式将"反向" *pi"反向" *pi,以便我可以检查" pi"是指指针类型.情况就是这样:我有 *pi,在.ll文件中,也许Pi是 %pi = alloca i32*, align 32 %1 =
0 2024-04-09
编程技术问答社区
编译器是否对净零位移位进行优化?
我有一些代码,例如以下代码块(我不允许发布原始代码).cpp我认为是由clang++>(Ubuntu clang version 3.5.2-3ubuntu1 (tags/RELEASE_352/final) (based on LLVM 3.5.2))编译的. 它看起来像C代码,因为我们正在使用GoogleTest来测试我们的C代码.无论如何: size_t const SHIFT = 4; uint8_t var, var2; /* Omitted: Code that sets var to, say 00011000 (base 2) */ var2 = var; var = var > SHIFT; // [1] result is 00011000 (base 2) (tested with printf) var2 = var2 > SHIFT; // [2] result is 00001000 (
0 2024-04-08
编程技术问答社区
fast-math导致对`__pow_finite'的未定义引用。
在Ubuntu 20.04上,当我使用Clang-8或Clang-9(Clang-9(Clang版本9.0.1-12))编译包含对LIBM引用的简单代码时,它将失败,而错误"未定义为"未定义的引用__pow_finite" __pow_finite" #include int main() { double x=1, y=1; x = pow(x,y); } clang-9 -lm test.c -ffast-math /usr/bin/ld: /tmp/test-9b1a45.o: in function `main': test.c:(.text+0x2a): undefined reference to `__pow_finite' readelf -Ws /lib/x86_64-linux-gnu/libm.so.6| grep pow_finite 626: 000000000002ed90 65 IFUNC GL
0 2024-04-08
编程技术问答社区
什么是Clang中的典型类型?
我有一个基于Clang的简单标头解析器,我从某些来源获得Typedef. struct _poire { int g; tomate rouge; }; typedef struct _poire kudamono; 解析此后,我有一个clang::TypedefDecl,然后我获得clang::TypedefDecl::getUnderlyingType() 的typedef的clang::QualType 使用QualType,如果我使用getAsString方法,我可以找到" struct _poire" std::string.一切都可以. 问题是,如果我尝试查看这种类型是否是规范类型,则使用QualType::isCanonical()返回false. 所以我尝试使用QualType::getCanonicalType().getAsString()获得规范类型,然后返回相同的字符串" struct _poire". 根据 http://clan
0 2024-04-07
编程技术问答社区
有什么区别? clang++ | clang -std=c++11
我一直在错误地使用此命令,该命令在链接步骤中失败: $ clang -std=c++11 -stdlib=libc++ myInputFile.cpp 谁能解释为什么clang提供C ++语言选项,为什么它无法链接?为什么这些选项-x c++>或-std=c++11不完成与clang++相同的事情?谢谢! 解决方案 从技术上讲,两个名为clang或clang++的程序都不是编译器:它们都是驱动程序 分析输入参数并确定要调用哪些编译器/汇编器/链接器关于哪些命令行参数的文件.两者之间的唯一区别是,如果clang执行链接,则仅针对C标准库链接,而clang++链接相对于C ++和C标准库. -x=选项覆盖了驱动程序程序的启发式方法,用于确定源文件语言,它指示驱动程序调用编译器 . -std=选项选择要使用的特定语言的方言.如果您需要确保您的C ++程序可移植到旧的C ++ 98编译器,则可以使用-st
2 2024-04-06
编程技术问答社区
如何强制clang默认使用某些库?
i构建 clang by clang libc ++ , libc ++ abi , compiler-rt 在以下步骤中: 要下载(和更新) llvm 和子项目,我使用以下脚本: svn co http://llvm.org/svn/llvm-project/llvm/trunk llvm cd llvm/tools svn co http://llvm.org/svn/llvm-project/cfe/trunk clang svn co http://llvm.org/svn/llvm-project/clang-tools-extra/trunk clang/tools/extra svn co http://llvm.org/svn/llvm-project/lldb/trunk lldb svn co http://llvm.org/svn/llvm-project/lld/trunk lld svn co http://llvm.org/svn/llvm-pro
0 2024-04-04
编程技术问答社区
在Windows上用clang 3.8构建boost
从周围的一些谷歌搜索中,Clang对Windows的支持最近正在改善,而Boost对Clang的支持也可能有所改善.但是,我对所有这些重型编译器配置的东西都是新手,并且不确定当前状态是什么. 我正在尝试运行命令: b2 --build-dir=build toolset=clang --build-type=complete stage 如第5.2.4节所建议Library binary" rel =" noreferrer"> www.boost.org/.../get_started/windows/windows . 这确实在某种程度上工作了,但是观看打印到屏幕的日志我看到了一些令人担忧的事情: 语句开始clang-linux.compile.c++....即使我在Windows上. 12 warnings generated.(或类似)也许总是这些是-Wunused-local-typedef,但我不确定. 2 warnings and 8 er
0 2024-04-02
编程技术问答社区
用自定义的Clang + Libc++(而不是stdlibc++)编译Tensorflow
我正在尝试使用自定义的clang/llvm工具链编译TensorFlow,并使用Clang的本机LIBC ++(而不是借用GCC的STDLIBC ++). 看起来Bazel Plain假设每个叮当 $ bazel build --cxxopt=-std=c++11 --cxxopt=-stdlib=libc++ tensorflow:libtensorflow.so INFO: Found 1 target... INFO: From Compiling external/protobuf/src/google/protobuf/compiler/js/embed.cc [for host]: external/protobuf/src/google/protobuf/compiler/js/embed.cc:37:12: warning: unused variable 'output_file' [-Wunused-const-variable] const char o
2 2024-03-29
编程技术问答社区
clang++在模板化类中的模板化方法的专门化时自动返回类型错误?
试图理解>另一个问题,我简化了获取以下代码的示例. template struct foo { template auto bar (int i) { return i; } }; template template auto foo::bar (int i) { return i; } int main() { return 0; } g ++ 4.9.2毫无问题地对其进行了编译; clang ++ 3.5给出以下错误 tmp_003-14,gcc,clang.cpp:12:20: error: out-of-line definition of 'bar' does not match any declaration in 'foo' auto foo::bar (int i)
0 2024-03-20
编程技术问答社区
为什么g++5在自动类型推理中推理出对象而不是initializer_list?
我最近遇到了此代码: struct Foo{}; int main() { Foo a; // clang++ deduces std::initializer_list // g++5.1 deduces Foo auto b{a}; a = b; } 它用G ++ 5.1编译,但在clang ++中失败(同时使用-std=c++11和-std=c++14,结果相同).原因是 解决方案 有一个C ++ 1Z的建议,可以实现Brace初始化的新类型扣除规则( n3922 ),我想海湾合作od 用于直接列表限制: 1.对于只有单个元素的支撑列表,自动扣除将从该条目中推导; 2.对于具有多个元素的支撑式列表,自动扣除将不正确. [示例: auto x1 = { 1, 2 }; // decltype(x1) is std::initializer_list auto x2 = { 1, 2.0 }; /
0 2024-03-20
编程技术问答社区
在Clang下,函数原型中不允许出现'auto'。
使用clang 3.5、3.6或3.7,使用标志std=c++1y以下代码未编译: #include auto foo(auto bar) { return bar; } int main() { std::cout declType(自动)参数与完美转发 non-lambdas的自动参数是 concepts lite ,因此不在C ++ 14: 中 clang是正确的,因为我们还没有自动参数. 概念Lite可能会带来这些,但C ++ 14没有它们. 如果我们使用 -pedantic 带有gcc的标志,我们会收到以下警
16 2024-03-20
编程技术问答社区
C++11中用户定义的属性?
是否有一种方法可以在C ++ 11或更高版本中创建用户定义的属性? 例如, [[noreturn]] void exit(); 是编译器定义的C ++ 11属性. 我想定义类似: [[comingsoon]] int function(int); 是否有一个机制? 编辑:我应该提到我正在使用clang. 解决方案 该语言无法添加属性. 当然,如果您使用的是clang,则可以编辑clang 的源,然后添加您喜欢的任何属性. 其他解决方案 目前不可能定义用户属性. 据我所知,没有关于此功能是否计划的信息. 但是,请查看STROUSTRUP的此FAQ答案:/faq/cpp11语言 - misc#属性,尤其是此部分: 一种计划的属性用途是改善对OpenMP的支持.例如: for [ [ omp::parallel() ] ] (int i=0; i
0 2024-03-19
编程技术问答社区
setjmp和longjmp的实现
基本上我的问题简而言之是我对setJMP和longJMP的实现 行不通.我之所以以此形式不在(代码审查)中问的是,我是新手,我对汇编的新手我很少有背景,但仍在学习,但仍然不确定代码(请阅读直到结束). 首先,我在两个平台上执行了三个不同编译器的代码 这就是为什么我确定我在汇编程序中做错了什么. 平台:Mac OS 10.12.5 X86_64,Ubuntu Linux X86 编译器:Apple LLVM Clang 8.0.0 x86_x64,clang 3.9.1 x86_x64,GCC 6.3 x86 我在所有平台上都以32位模式编译了代码,因此Linux和Mac上的生成机器代码为32bit. 我将在此处发布的代码是在Apple Clang下进行编译的,而没有使用-M32标志来生成32位机器代码 的优化. #include typedef unsigned long jmp_buf[6]; int Setjmp(jmp_buf v
0 2024-03-17
编程技术问答社区
了解clang在汇编中的作用,为一个正在增量的循环做减法
请在C ++中考虑以下代码: #include std::size_t count(std::size_t n) { std::size_t i = 0; while (i 1 ? std::atoll(argv[1]) : 1); } 这只是一个循环,它正在增加其值,并在最后返回它. asm volatile防止循环被优化.我们在g++ 8.1和clang++ 5.0下将其编译为参数-Wall -Wextra -std=c++11 -g -O3. 现在,如果我们看什么count(unsigned long): mov rax, rdi test rdi,
0 2024-03-17
编程技术问答社区
在两个ASM GCC内联块之间传播提携位
亲爱的汇编/C ++开发, 问题是:即使有效,两个ASM块之间的进位(或任何标志)是否是现实的或完全疯狂的? 几年前,我开发了一个整数库,用于低于512位的大型算术库(在编译时).我目前没有使用GMP,因为对于此规模,GMP由于内存分配而变得较慢,并且模型选择二进制表示 bench . 我必须承认我使用BOOST_PP创建了我的ASM(字符串块),它不是很光荣(因为好奇的是 vli ).图书馆运作良好. 但是,我目前不可能在两个ASM内联块之间传播状态寄存器的进位旗.这是合乎逻辑的,因为对于由两个块之间的编译器生成的任何助记符,寄存器是重置的(除了mov指令(来自我的汇编知识)除外). 昨天,我有一个想法是在两个ASM块之间传播进位有点棘手(使用递归算法).它在工作,但我认为我很幸运. #include #include #include #include //forw
0 2024-03-17
编程技术问答社区
计数2个缓冲区之间的差异似乎太慢了
我的问题 i具有相同大小(每个约20 MB)字节的2 相邻缓冲区.我只想计算它们之间的区别. 我的问题 这个循环在4.8GHz Intel I7 9700K上使用3600mt RAM? 应该花费多少时间 我们如何计算最大理论速度? 我尝试的 uint64_t compareFunction(const char *const __restrict buffer, const uint64_t commonSize) { uint64_t diffFound = 0; for(uint64_t byte = 0; byte (buffer[byte] != buffer[byte + commonSize]); return diffFound; } 我的PC上需要11ms(9700K 4.8GHz
2 2024-03-17
编程技术问答社区
无法使用clang++交叉编译代码
命令: 我试图使用Clang ++交叉编译简单的C ++程序.我正在使用Linaro GCC工具链获取库,而其他包括所需的库. ${root}/bin/clang++ --target=arm-linux-gnueabihf --rtlib=compiler-rt --stdlib=libc++ -nostdinc++ -I${root}/include/c++/v1 -Wl,-L${root}/lib --sysroot ${sysroot} --gcc-toolchain=/home/user/Tejas/LLVM/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf -rpath ${root}/lib TestCodeX86toARM.cpp -o Test -v root和sysroot的值如下: root=/path/to/clang/install_dir sysroot=/path/to/lin
14 2024-03-03
编程技术问答社区
clang 4 在 <functional> 上的构建错误与 c++1z
我刚刚将我的Arch Linux系统更新为包括GCC 7.1.1的最新系统.试图构建这个: #include int main(int argc, char** argv) { return 1; } 使用命令 clang++ main.cpp -std=c++1z 导致错误: In file included from main.cpp:1: In file included from /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/7.1.1/../../../../include/c++/7.1.1/functional:60: In file included from /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/7.1.1/../../../../include/c++/7.1.1/unordered_map:47: In file incl
2 2024-03-03
编程技术问答社区
苹果Clang 13 C++20模块支持缺失
根据官方文档 Clang 13支持C ++ 20模块通过使用-fmodules命令行参数. 我什至无法使用Clang 13(Macos Monterey)在Intel或M1的Macs上获得基本模块. 假设文件的以下文本内容module.cpp: export module a; export int f(int a, int b) { return a + b; } 运行以下内容: $ clang++ --version Apple clang version 13.0.0 (clang-1300.0.29.3) Target: x86_64-apple-darwin21.1.0 $ clang++ -std=c++20 -stdlib=libc++ -fmodules -fbuiltin-module-map -c module.cpp module.cpp:1:8: error: expected template export module
6 2024-03-02
编程技术问答社区