标签: llvm-clang

如何在cygwin上构建llvm和clang

我可以在cygwin上从源代码构建LLVM和clang 吗?

构建LLVM和Clang需要多长时间?因为我尝试在VirtualBox上构建它们,大约需要2个小时.

cygwin llvm-clang

8
推荐指数
3
解决办法
1万
查看次数

ARC的Objective-C命名约定和可能的警告

我有纯ARC编码的经验.作为一个编译器功能,它尊重Objctive-C方法系列,只要需要就设置正确的保留/释放调用.

所有以启动方法alloc,mutableCopy,copynew创建新的对象.它们增加了保留计数.因此,当我不再需要时,ARC将释放任何指针(以及与之关联的对象).

我认为当我编写不遵循命名约定的方法时,可能会出现问题.例如,如果我newCustomer在第一个版本中编写类似的方法返回自动释放的对象,而在第二个版本中则不会,会发生什么?

特别是,我的问题如下(它们属于同一推理):

  • 如果调用和被调用的代码都是用ARC编译的,会发生什么?
  • (a)如果使用ARC编译调用代码而使用非ARC编译调用时会发生什么?
  • (b)如果在使用ARC编译调用时使用非ARC编译调用代码会发生什么?

会意识到一个答案,显示ARC怎样在底层工作(下objc_release,objc_retainAutoreleasedReturnValue等).

先感谢您.

objective-c llvm-clang automatic-ref-counting

8
推荐指数
1
解决办法
2205
查看次数

对于什么以及从哪里调用Compiler-RT?

我想知道关于LLVM的Compiler-RT项目的以下内容:从它调用的程序.根据我的理解,Compiler-RT是一组函数,它们处理LLVM中的指令,这些指令实际上没有硬件对应物(它还有更多的东西吗?).因此,如果我在LLVM中使用除法,则应该用适当的Compiler-RT函数替换它.首先,如果这不正确,请纠正我!

其次,我很好奇谁生成Compiler-RT用法.它是Clang还是LLVM直接.我可以为LLVM编写不同的前端,LLVM会在适当的时候自动处理Compiler-RT的使用吗?

compiler-construction runtime llvm clang llvm-clang

8
推荐指数
1
解决办法
2621
查看次数

Xcode和C11 stdatomic.h

看起来像Xcode 5和更高版本支持C11但是当我尝试包含stdatomic.h时它说它找不到文件?是否有可能在Xcode中使用C11原子结构?

c xcode llvm-clang c11 stdatomic

8
推荐指数
1
解决办法
2032
查看次数

将OpenMP与llvm-clang一起使用

所以我尝试将OpenMP与最新版本的clang一起使用clang version 3.4.2 (tags/RELEASE_34/dot2-final).按照程序编译并添加PATH omp.h,然后使用以下命令编译我的hello.c:

clang -fopenmp hello.c
Run Code Online (Sandbox Code Playgroud)

然后运行它,仍然不能使用超过1个线程:

Bash-4.1$ ./a.out 
Hello from thread 0, nthreads 1
Run Code Online (Sandbox Code Playgroud)

PS:我试图手动导出,export OMP_NUM_THREADS=8但也没有解决任何问题.有任何想法吗?

更新:这是hello.c:

#include <omp.h>
#include <stdio.h>
int main() {
#pragma omp parallel
printf("Hello from thread %d, nthreads %d\n", omp_get_thread_num(), omp_get_num_threads());}
Run Code Online (Sandbox Code Playgroud)

c openmp llvm-clang

8
推荐指数
1
解决办法
2279
查看次数

Clang -Wweak-vtables和纯抽象类

关于此主题的先前问题:

这是我最近提出的问题的后续跟进: clang:没有外线虚拟方法定义(纯抽象C++类) ,并且被标记为此问题的副本:clang的-Wweak-含义是什么?虚函数表?.我不认为那回答了我的问题,所以在这里我专注于困扰我的事情,但尚未得到回答.

我的情景:

我正在尝试使用Clang-3.5编译以下简单的C++代码:

test.h:

class A
{
  public:
    A();
    virtual ~A() = 0;
};
Run Code Online (Sandbox Code Playgroud)

test.cc

#include "test.h"

A::A() {;}
A::~A() {;}
Run Code Online (Sandbox Code Playgroud)

我用来编译它的命令(Linux,uname -r:3.16.0-4-amd64):

$clang-3.5 -Wweak-vtables -std=c++11 -c test.cc
Run Code Online (Sandbox Code Playgroud)

而我得到的错误:

./test.h:1:7: warning: 'A' has no out-of-line virtual method definitions; its vtable will be emitted in every translation unit [-Wweak-vtables]
Run Code Online (Sandbox Code Playgroud)

当A类不是纯抽象时,上面的代码构建得很好.以下代码不会发出警告,唯一的变化是A类不再是抽象的:

test2.h:

class A
{
  public:
    A();
    virtual ~A();
};
Run Code Online (Sandbox Code Playgroud)

test2.cc

#include "test2.h"

A::A() {;}
A::~A() {;}
Run Code Online (Sandbox Code Playgroud)

我的问题

上面的代码在Clang中触发警告的纯抽象类有什么特别之处?

c++ abstract-class clang llvm-clang clang++

8
推荐指数
1
解决办法
3103
查看次数

LLVM结构数组迭代

使用LLVM编译此代码时:

struct bar {
    int int1;
    int int2;
    char char1;
    char char2;
    char char3;
};


struct foo {
    struct bar array[16];
};


int func(struct foo *f, int num) {

    for(int i = 0; i < num; i++){
        f->array[i].int1 = 1;
        f->array[i].int2 = 2;
        f->array[i].char1 = 'a';
        f->array[i].char2 = 'b';        
        f->array[i].char3 = 'c';        
    }
    return num;
}
Run Code Online (Sandbox Code Playgroud)

由于某种原因,编译器决定以奇怪的方式迭代这个数组.首先,它在结构的中间或末尾选择一个看似任意的点,然后使用相对于任意点的immediates存储适当的值.

我发现从这个IR代码中选择了任意点:

  %scevgep = getelementptr %struct.foo* %f, i32 0, i32 0, i32 0, i32 4
Run Code Online (Sandbox Code Playgroud)

其中4是char3的偏移量.

在这个例子中,int1,int2,char1,char2的存储将具有负的immediates,char3将立即为0.

似乎使用结构条的不同排列,您可以得到不同的偏移量,但始终在结构体的内部或末尾.

例如,将struct bar更改为:

struct bar {
    char …
Run Code Online (Sandbox Code Playgroud)

c llvm llvm-clang llvm-ir

8
推荐指数
1
解决办法
333
查看次数

如何忽略作为clang C++模块一部分的头文件中的警告?

我们正在使用clang -fmodule-fcxx-module启用模块支持,如http://clang.llvm.org/docs/Modules.html中所述.通过为我们的核心库定义模块映射,我们已经看到了构建时间的显着改进.

但是,我们有一些库头文件使用编译指示来禁用某些行的警告,例如:

template <typename TFloat>
static bool exactlyEqual(TFloat lhs, TFloat rhs)
{
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wfloat-equal"
    return lhs == rhs;
#pragma clang diagnostic pop
}
Run Code Online (Sandbox Code Playgroud)

当这头拉在为预编译的模块,它似乎铿锵的内部表示不保留编译信息和警告仍然发出.由于我们将警告视为错误,因此导致编译失败.有些人可能会争辩说float-equal完全禁用,但我们还有其他一些具有不同警告的情况,我们不希望全局禁用.

我们已经在使用-Wno-system-headers,-isystem所以图书馆的客户端通常不会看到这样的警告(即使没有编译指示),但是当标头作为模块导入时,这似乎不起作用.此外,我们仍然会对库内部的代码发出这些警告,其中包含标头作为非系统标头(即不使用-isystem/使用双引号),因为模块预编译和导入也发生在这里.

我尝试使用_Pragma(...)而不是#pragma没有任何影响.

是否有其他方法有条件地忽略来自预编译的clang模块的标题中的警告?

更新:我已经把一个样本项目多达上https://github.com/MikeWeller/ClangModuleWarnings其重现问题

更新:似乎[system]模块属性将禁止所有警告.然而,这甚至会抑制我们在构建库本身时想要看到的警告,并且我们不希望制作所有模块系统模块.如果我们在构建库本身时找到了不使用库模块映射的方法,这可能是可以接受的,但我们仍然希望对非系统模块进行某些警告.

c++ clang llvm-clang clang++

8
推荐指数
0
解决办法
977
查看次数

Objective-C中的扩展问题

以下是处理类扩展的代码段.我要做的是生成一个称为内部ID的随机ID(稍后由程序使用),它以加密形式存储在内存中.代码无法使用gcc和clang编译(我在Windows上通过GNUStep运行Objective C),每个编译器都有不同的错误消息,在代码中作为注释提到.

请注意,我知道这个问题可以通过忽略主@faceface(即#import语句之后的那个)本身的扩展和声明方法和属性来轻松解决.我使用扩展的唯一原因是这个类是由一些其他子类继承的,"internalID"属性必须是不可访问的.

#import <Foundation/Foundation.h>

@interface Foo : NSObject
{
    NSString * idStr;
}
- (void)setInternalID;
- (NSString *)fetchExternalID;
@end

// Extension declaration
@interface Foo()
{ // Compilation via gcc throws error at this line stating "Expected identifier or '(' before '{' token"
    NSString *internalID; // Compilation via clang throws error at this line stating "instance variables may not be placed in class extension"
}
@end

@implementation Foo
- (void)setInternalID{
    internalID = [NSString stringWithFormat: 
    @"__KEY__INTERNAL__DUMP2872167841398551___8765%d98KLPYFGF(&^$#ESFK___JNHGV",arc4random()%100];
}
- (NSString *)fetchExternalID{
    NSString …
Run Code Online (Sandbox Code Playgroud)

gcc objective-c gnustep llvm-clang class-extensions

8
推荐指数
1
解决办法
234
查看次数

将LLVM Clang 4.xx/5.xx/6.xx集成到Visual Studio 2017中

用于Windows官方LLVM 4.0版本与Visual Studio集成到Visual Studio 2015.不幸的是它仍然不支持Visual Studio 2017.

当您尝试将项目的平台工具集设置为时LLVM-vs2014,会弹出错误.

你知道有什么方法让它起作用吗?


更新

在2018年,LLVM 6.0官方仍然不支持与Visual Studio 2017(版本15.XX)集成,仅支持Visual Studio 2015(版本14.XX)工具集.

msbuild llvm visual-studio llvm-clang visual-studio-2017

8
推荐指数
2
解决办法
1万
查看次数