2016-05-13 22 views
3

Ich versuche, OSX mit llvm 3.8 zu erstellen und anzuwenden. Ich installierte llvm 3.8 mit dieser Formel mit brauen: $brew install llvm38 Innerhalb des Pass ich folgendes haben:Erstellen und Verwenden eines Durchgangs für LLVM 3.8 unter OSX

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

Mein Makefile den Pass zu bauen wie folgt aussieht:

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 [email protected] 

Wenn gibt mir ein paar clang: warning: -l[some lib]: 'linker' input unused. Es gibt auch mir:

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

Aber es gibt ein .dylib und .o so gehe ich vor, es auszuprobieren. So, jetzt , dass ich einen Pass habe ich kann es auf meine .bc Datei anwenden und dafür verwende ich ein Makefile so (ich die Definitionen der Kürze omited):

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

Dies führt zu:

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

und gibt diese zu mir:

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 

Meine Vermutung ist, dass dies durch die nicht verwendeten Argumente während der Kompilierung verursacht wird, aber ich weiß nicht, warum sie in erster Linie nicht verwendet werden da sie eine gemeinsame Bibliothek erstellen müssen.

Was mache ich falsch und wie kann ich das beheben?

+0

Was gibt opt ​​-load pass.dylib -help? – khrm

+0

$ opt-load pass.dylib -help ÜBERBLICK: llvm .bc -> .bc modulare Optimierer und Analyse Drucker ANWENDUNG: opt [Optionen] OPTIONEN: ... –

+1

Ich möchte wissen, ob es -pass 'zeigt in Hilfe? – khrm

Antwort

3

Ich habe das Problem gelöst. Es gibt zwei Probleme mit Ihrem Makefile.

Zuerst müssen Sie die undefinierten Symbole unterdrücken, indem Sie ld-Flags übergeben, wenn Sie ein flacher Namespace sind. Oder verwenden Sie dynamisches Nachschlagen zum Verknüpfen, während Sie einen Namespace mit zwei Ebenen verwenden.

Das zweite Problem tritt auf, wenn Sie das erste Problem beheben. Es bewirkt, dass in flachem Namensraum während der Ausführung opt:

CommandLine Error: Option 'pass-remarks' registered more than once! LLVM ERROR: inconsistency in registered CommandLine options

Sie brauchen nicht --libs zu passieren LLVM-config. Es verursacht einen Konflikt mit Symbolen, die von opt und Ihrem Pass kommen. Im Namensraum für zwei Ebenen wird dieser Fehler nicht angezeigt. Nur dass Ihre Option ist Unknown Befehlszeilenargument wie vorherige Fehler.

Mein Makefile (Ich habe eine kommentierte ldflag auch für Zwei-Ebenen-Namespace, den Standard ist LLVM Projekt flachen Namespace verwendet, so habe ich verwendet, dass.):

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 [email protected] 
$(OBJ): pass.cpp 
     $(COMPILER) $(CXXFLAGS) -c $^ -o [email protected] 

Eine andere kleine Veränderung, die ich tat, ist hat -bundle nur aus Gründen der Korrektheit hinzugefügt, da es sich nicht um eine gemeinsam genutzte Bibliothek handelt, sondern um ein ladbares Bündel, das nicht als Bibliothek verknüpft werden kann. Wenn Sie es nicht hinzufügen, spielt es keine Rolle, aber Ihre Ausgabe ist kein Bündel.

Stackoverflow verursacht ein Problem mit Makefile. Beim Kopieren ersetzen Tabs mit Leerzeichen. Beziehe dich auch auf: https://developer.apple.com/library/mac/documentation/DeveloperTools/Conceptual/MachOTopics/1-Articles/executing_files.html für warum du unterdrücken musst.

Ich habe dieses Problem wirklich genossen (obwohl es dauerte mir ganze 1 und einen halben Tag zu verstehen und zu lösen).

+0

Nur eine kleine Anpassung der SUFIX in meinem Fall wäre .dylib –

+0

Ja. LLVM Projekt verwendet Dylib. Aber wenn Sie "file" PassName.dylib "" für llvm passieren, werden Sie sehen, dass es Bündel ist. Für Bündel empfiehlt Apple .bundle oder .so. Also ich bevorzuge das. Aber es ist sowieso egal. – khrm