我可以在cygwin上从源代码构建LLVM和clang 吗?
构建LLVM和Clang需要多长时间?因为我尝试在VirtualBox上构建它们,大约需要2个小时.
我有纯ARC编码的经验.作为一个编译器功能,它尊重Objctive-C方法系列,只要需要就设置正确的保留/释放调用.
所有以启动方法alloc,mutableCopy,copy并new创建新的对象.它们增加了保留计数.因此,当我不再需要时,ARC将释放任何指针(以及与之关联的对象).
我认为当我编写不遵循命名约定的方法时,可能会出现问题.例如,如果我newCustomer在第一个版本中编写类似的方法返回自动释放的对象,而在第二个版本中则不会,会发生什么?
特别是,我的问题如下(它们属于同一推理):
会意识到一个答案,显示ARC怎样在底层工作(下objc_release,objc_retainAutoreleasedReturnValue等).
先感谢您.
我想知道关于LLVM的Compiler-RT项目的以下内容:从它调用的程序.根据我的理解,Compiler-RT是一组函数,它们处理LLVM中的指令,这些指令实际上没有硬件对应物(它还有更多的东西吗?).因此,如果我在LLVM中使用除法,则应该用适当的Compiler-RT函数替换它.首先,如果这不正确,请纠正我!
其次,我很好奇谁生成Compiler-RT用法.它是Clang还是LLVM直接.我可以为LLVM编写不同的前端,LLVM会在适当的时候自动处理Compiler-RT的使用吗?
看起来像Xcode 5和更高版本支持C11但是当我尝试包含stdatomic.h时它说它找不到文件?是否有可能在Xcode中使用C11原子结构?
所以我尝试将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) 关于此主题的先前问题:
这是我最近提出的问题的后续跟进: 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中触发警告的纯抽象类有什么特别之处?
使用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) 我们正在使用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]模块属性将禁止所有警告.然而,这甚至会抑制我们在构建库本身时想要看到的警告,并且我们不希望制作所有模块系统模块.如果我们在构建库本身时找到了不使用库模块映射的方法,这可能是可以接受的,但我们仍然希望对非系统模块进行某些警告.
以下是处理类扩展的代码段.我要做的是生成一个称为内部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) 用于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)工具集.