在OSX

时间:2016-05-13 12:57:58

标签: c++ macos makefile llvm llvm-ir

我尝试使用llvm 3.8在OSX上构建和应用传递。 我使用brew使用以下公式安装llvm 3.8:$brew install llvm38 在通行证内我有以下内容:

static RegisterPass<SwiftPass> X("pass", "My Pass");

构建传递的Makefile如下所示:

LIB_NAME = pass$(SUFIX)
LDFLAGS = $(shell $(LLVM_PATH)llvm-config --ldflags)
CXXFLAGS = -g -Wall -fno-rtti -fPIC -std=c++11 -shared -dynamiclib $(shell $(LLVM_PATH)llvm-config  --cxxflags --system-libs --libs core executionengine interpreter mc support nativecodegen)
COMPILER = clang++
all: $(LIB_NAME)
$(LIB_NAME): $(OBJ)
    $(COMPILER) $(CXXFLAGS) $(LDFLAGS) $^ -o $@

如果给我一些clang: warning: -l[some lib]: 'linker' input unused。它还给了我:

clang: warning: argument unused during compilation: '-shared'
clang: warning: argument unused during compilation: '-dynamiclib'

但它输出.dylib和.o所以我继续试试。 所以现在我有一个传递,我可以将它应用到我的.bc文件,为此,我使用这样的Makefile(我省略了简洁的定义):

$(LLVM_OPT) -load $(PASSFILE) $(PASSNAME) $(NAME).bc -o $(NAME).afterMyPass.bc

这转换为:

opt -load pass.dylib -pass int.bc -o int.afterMyPass.bc

并将此归还给我:

opt: Unknown command line argument '-pass'.  Try: '/usr/local/Cellar/llvm38/3.8.0/lib/llvm-3.8/bin/opt -help'
opt: Did you mean '-slsr'?
make: *** [pass] Error 1

我的猜测是,这是由编译期间未使用的参数引起的,但我不知道为什么它们首先被使用,因为它们需要构建共享库。

我做错了什么,如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

我已经解决了这个问题。 Makefile有两个问题。

首先,如果是平面命名空间,则需要通过传递ld标志来抑制未定义的符号。或者在使用两级命名空间时使用动态查找链接。

解决第一个问题时会出现第二个问题。它在执行opt期间导致平面命名空间:

  

CommandLine错误:选项'pass-remarks'多次注册!   LLVM错误:已注册的CommandLine选项不一致

您不需要将-libs传递给llvm-config。它会导致与来自opt和你的通行证的符号发生冲突。在两级名称空间中,它不会给出此错误。只是您的选项是未知的命令行参数,如上一个错误。

我的Makefile(我有一个注释的ldflag也用于两级命名空间,这是默认的.LLVM项目使用平面命名空间,所以我使用了它):

SUFIX=.so
OBJ=pass.o
LIB_NAME = pass$(SUFIX)
LLVM_PATH=/usr/local/Cellar/llvm38/3.8.0/bin/
LDFLAGS = $(shell $(LLVM_PATH)llvm-config-3.8 --ldflags)
LDFLAGS +=-Wl,-dead_strip -Wl,-flat_namespace -Wl,-undefined -Wl,suppress
#LDFLAGS += -Wl,-dead_strip -Wl,-undefined,dynamic_lookup
CXXFLAGS = -g -Wall -fno-rtti -fPIC -std=c++11 $(shell $(LLVM_PATH)llvm-config-3.8  --cxxflags --system-libs)
COMPILER = clang++
all: $(LIB_NAME)
$(LIB_NAME): $(OBJ)
        $(COMPILER) $(CXXFLAGS) -bundle $(LDFLAGS) $^ -o $@
$(OBJ): pass.cpp
        $(COMPILER) $(CXXFLAGS) -c $^ -o $@

我做的另一个小改动是为了正确性添加了-bundle,因为它不是共享库而是可加载的bundle,它不能作为库链接。如果你不添加它,它没关系,但你的输出不是捆绑。

Stackoverflow导致makefile出现问题。使用空格复制替换选项卡时。另请参阅:https://developer.apple.com/library/mac/documentation/DeveloperTools/Conceptual/MachOTopics/1-Articles/executing_files.html了解您需要压制的原因。

我真的很喜欢这个问题(即使我花了整整一天半的时间来理解和解决)。