标签: llvm-clang

无法使用clang交叉编译到SPARC

所以情况就是这样:我需要能够从Linux机器(在Ubuntu上,它的价值)编译二进制文件,它们能够从SPARC服务器运行.我正在尝试编译的程序非常简单:

#include <stdio.h>
#include <stdlib.h>

int main() {
    printf("Testing the SPARC program...");
    return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

我已经尝试了许多不同的编译行来使它工作,但不幸的是似乎没有任何工作.

我试过传统的:

 clang -target sparc blah.c -o blahsparc
Run Code Online (Sandbox Code Playgroud)

但这不起作用,有一堆汇编程序失败:

 /tmp/blah-519e77.s: Assembler messages:
 /tmp/blah-519e77.s:7: Error: unknown pseudo-op: '.register'
 /tmp/blah-519e77.s:8: Error: unknown pseudo-op: '.register'
 /tmp/blah-519e77.s:9: Error: unknown pseudo-op: '.register'
 /tmp/blah-519e77.s:10: Error: unknown pseudo-op: '.register'
 /tmp/blah-519e77.s:11: Error: no such instruction: 'save %sp,-240,%sp'
 /tmp/blah-519e77.s:12: Error: no such instruction: 'st %g0, [%fp+2043]'
 ...
 clang: error: assembler (via gcc) command failed with exit code 1 (use -v to see invocation)
Run Code Online (Sandbox Code Playgroud)

我也试过这个: …

c c++ sparc clang llvm-clang

7
推荐指数
1
解决办法
1506
查看次数

使用clang匹配器来检测模式序列

是否可以使用clang匹配器来识别程序中的模式序列?

例如,我需要找到pattern1在pattern2之前发生的情况.

例如:

Pattern1 =为指针P
pattern2 =取消引用指针P赋值

我可以识别出代码中出现pattern1和pattern2的情况,但是可以指定一个排序吗?(假设pattern1必须在pattern2之前发生并且只匹配那些情况)谢谢!

c matcher clang abstract-syntax-tree llvm-clang

7
推荐指数
1
解决办法
235
查看次数

在CMake中指定CUDA编译器

我正在尝试使用clang-3.9基于以下文档构建一个cuda项目.但我想用cmake来构建我的项目.我已经分别将CMAKE_CC_COMPILER和CMAKE_CXX_COMPILER设置为clang和clang ++.

但问题是,如果我使用

file(GLOB_RECURSE CUDA_SOURCES "./*.cu")
CUDA_ADD_LIBRARY(Benchmarks_CUDA ${CUDA_SOURCES})
Run Code Online (Sandbox Code Playgroud)

在我的CMakeList.txt中,cmake默认使用nvcc编译器.但相反,我想使用clang来编译.cu文件.

相反,如果我使用

add_library (Benchmarks_CUDA ${CUDA_SOURCES})
Run Code Online (Sandbox Code Playgroud)

然后我会得到一个错误

CMake Error: Cannot determine link language for target "Benchmarks_CUDA".
CMake Error: CMake can not determine linker language for target: Benchmarks_CUDA
Run Code Online (Sandbox Code Playgroud)

有人可以告诉我如何使用cmake使用clang构建.cu文件.

cmake llvm clang llvm-clang

7
推荐指数
1
解决办法
993
查看次数

如何获取 Clang 中所有标准预定义宏的列表

我可以在终端中使用以下命令获取 Clang 编译器预定义宏的列表。(参考

clang -dM -E -x c /dev/null
Run Code Online (Sandbox Code Playgroud)

但是,此列表不包含标准预定义宏,例如__FILE____LINE____FUNCTION__等(GCC 版本的列表

  • Q1. 是否可以在终端中获取 Clang 中的标准预定义宏列表?

  • Q2。如果没有,Clang 文档或在线内容中是否有标准预定义宏的完整列表?

我的环境是 macOS Sierra 版本 10.12.1 (16B2555),Clang Apple LLVM 版本 8.0.0 (clang-800.0.42.1)

c macos macros clang llvm-clang

7
推荐指数
0
解决办法
2975
查看次数

std :: variant &lt;&gt; :: get()无法与Apple LLVM 10.0一起编译

我在玩与C ++ 17的std ::变异类型,并试图编译cppreference示例代码get()

#include <variant>
#include <string>

int main()
{
    std::variant<int, float> v{12}, w;
    int i = std::get<int>(v);
    w = std::get<int>(v);
    w = std::get<0>(v); // same effect as the previous line

//  std::get<double>(v); // error: no double in [int, float]
//  std::get<3>(v);      // error: valid index values are 0 and 1

    try {
      std::get<float>(w); // w contains int, not float: will throw
    }
    catch (std::bad_variant_access&) {}
}
Run Code Online (Sandbox Code Playgroud)

在XCode 10中。我的项目设置为C ++ 17,但是出现编译器错误:

调用不可用的功能'get':macOS 10.14中引入

'bad_variant_access'不可用:在macOS …

c++ variant llvm-clang c++17

7
推荐指数
2
解决办法
1327
查看次数

将文字值分配给 LLVM IR 中的局部变量

我一直在搞乱 LLVM IR 的代码生成,有一点我不太明白,那就是什么时候必须分配局部变量,以及如何将文字值加载到局部变量中的区别。如果我将以下简单的 C 代码编译为 LLVM IR,

//test.c
int main() {
    int x = 3;
    int y = x + 4;
    return y;
}
Run Code Online (Sandbox Code Playgroud)

我得到这个输出:

; ModuleID = 'test.c'
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
target triple = "x86_64-apple-macosx10.10.0"

; Function Attrs: nounwind ssp uwtable
define i32 @main() #0 {
    %1 = alloca i32, align 4
    %x = alloca i32, align 4
    %y = alloca i32, align 4
    store i32 0, i32* %1
    store i32 3, i32* %x, align 4
    %2 …
Run Code Online (Sandbox Code Playgroud)

assembly llvm llvm-clang llvm-ir

6
推荐指数
1
解决办法
2141
查看次数

在叮当声中展开循环

我正在尝试有选择地展开以下程序中的第二个循环:

#include <stdio.h>

int main()
{
    int in[1000], out[1000]; 
    int i,j;

    #pragma nounroll
    for (i = 100; i < 1000; i++)
    {
       in[i]+= 10;
    }

    #pragma unroll 2
    for (j = 100; j < 1000; j++)
    {
       out[j]+= 10;
    }

    return 1;
}
Run Code Online (Sandbox Code Playgroud)

当我使用以下选项运行 clang (3.5) 时,它会将两个循环展开 4 次。

clang -std=c++11 -O3 -fno-slp-vectorize -fno-vectorize -mllvm -unroll-count=4 -mllvm -debug-pass=Arguments -emit-llvm -c *.cpp 
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?此外,如果我添加-fno-unroll-loops或跳过-unroll-count=4标志,它不会展开任何循环。

另外,有关如何调试 pragma 错误的任何提示?

c++ optimization clang llvm-clang loop-unrolling

6
推荐指数
1
解决办法
9741
查看次数

在 Windows 上使用 CMake 构建 llvm

我正在尝试按照 llvm说明在 Windows 10 pro 上构建 LLVM/Clang 。我也遵循了我可以从以前的帖子和其他网站中找到的所有建议,但仍然出现错误。谢谢您的帮助。

我分别用 GCC 和 Visual Studio 尝试过。以下是我使用的工具:

  • CMake 3.8.0
  • MinGW GCC 5.3.0 / Visual Studio 15
  • 蟒蛇 2.7
  • LLVM / Clang 4.0(源文件)

这是我得到的:

  • 我检查了工具的路径,我认为没问题
  • CMake 能够找到编译器(GCC 或 Visual Studio)并开始配置。
  • 但是这两种方法都缺少很多文件,只缺少不同的文件
  • 我还尝试将库和组件添加到 MinGW/msys 和 Visual Studio 安装中。但它没有帮助。

以下是我尝试使用 GCC 时获得的日志:

-- The C compiler identification is GNU 5.3.0
-- The CXX compiler identification is GNU 5.3.0
-- The ASM compiler identification is GNU
-- Found assembler: C:/MinGW/bin/gcc.exe
-- Check …
Run Code Online (Sandbox Code Playgroud)

c++ cmake llvm-clang

6
推荐指数
0
解决办法
2242
查看次数

如何识别 LLVM/C++ 中的任何类型的指令?

我被要求做一个 LLVM 函数,它允许我找到:跳转/分支、加载/存储、调用、“算术和其他类型的指令”。

就我设法做的而言,我已经能够找到使用 dyn_cast 执行以下代码的 CallInst、LoadInst、StoreInst 和 BranchInst:

for (const Function &F : *M) 
    for (const BasicBlock &BB : F) 
        for (const Instruction &I : BB) 
            if (const StoreInst *SI = dyn_cast<StoreInst>(&I)) 
                 count++;;
Run Code Online (Sandbox Code Playgroud)

我正在努力寻找一种提取所有算术和“其他类型”指令的方法。

谢谢你的时间。

c++ types casting llvm-clang

6
推荐指数
1
解决办法
1981
查看次数

EnableABIBreakingChecks 上的编译失败

我最近安装了 LLVM v8.0.0(在 RHEL 7.4 上)。我正在阅读LLVM Kaleidoscope 教程以了解如何使用该系统,但遇到了链接问题。

根据教程(第 2 章结尾),我运行:

clang++ -g -O3 kld.cpp `llvm-config --cxxflags` -o kld
Run Code Online (Sandbox Code Playgroud)

它编译,但链接器失败:

/tmp/kld-f7264f.o:(.data+0x0): undefined reference to `llvm::EnableABIBreakingChecks'
clang-8: error: linker command failed with exit code 1 (use -v to see invocation)
Run Code Online (Sandbox Code Playgroud)

我怀疑这可能是 的问题llvm-config,所以我也尝试使用--ldflags--system-libs标志,但没有运气。

llvm-config --cxxflags 给出(重新格式化以提高可读性)

-I~/project/llvm-src/include -I~/project/llvm-build/include 
-fPIC -fvisibility-inlines-hidden
-std=c++11
-Wall -Wextra -Wno-unused-parameter -Wwrite-strings -Wcast-qual
-Wno-missing-field-initializers -pedantic -Wno-long-long
-Wno-maybe-uninitialized -Wdelete-non-virtual-dtor -Wno-comment
-g 
-fno-exceptions -fno-rtti
-D_GNU_SOURCE -D_DEBUG -D__STDC_CONSTANT_MACROS
-D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS
Run Code Online (Sandbox Code Playgroud)

哪里~/... …

abi llvm llvm-clang llvm-c++-api

6
推荐指数
3
解决办法
2188
查看次数