LevelDB als LLVM-Binary auf Linux kompilieren

English Deutsch

Vor einiger Zeit habe ich eine Anleitung zum Kompilieren und Installieren von LevelDB auf Linux geschrieben.

Kürzlich versuche ich verzweifelt, mich in LLVM einzuarbeiten, und eine Tutorial-Serie zur Verwendung von LLVM mit C/C++ folgt in Kürze.

Da ich LevelDB in vielen meiner Projekte verwende, möchte ich eine Möglichkeit haben, eine LLVM-IR (Intermediate Representation) des LevelDB-C++-Quellcodes zu generieren – ich könnte ein LLVM-Programm mit der nativen Binärdatei linken, aber um von LLVMS Features zu profitieren, gehe ich davon aus, dass die Verwendung von IRs für so viele Abhängigkeiten wie möglich der richtige Weg ist.

Grundsätzlich gibt es zwei Wege:

  1. Das g++ LLVM-Backend verwenden
  2. clang++ verwenden

Ich neige dazu, clang++ für LLVM-Aufgaben zu verwenden, denn selbst mit colorgcc und einigen aktuellen Verbesserungen in der GCC-Fehlermeldungs-Generierung bevorzuge ich die clang++-Fehlermeldungen, auch wenn ich viel mehr Erfahrung mit GCC-Fehlermeldungen habe. Zusätzlich scheint das g++ mit LLVM-Backend einige Bugs zu haben, darunter die Interpretation von -emit-llvm als -e -m -i …, plus aktuelle Distributionsversionen funktionieren nicht gut mit dem LLVM-Gold-Plugin und es hat sich als schwierig erwiesen, GCC zuverlässig mitzuteilen, dass es llvm-ld als Linker verwenden soll.

Edit: Es scheint, als ob llvm-gcc seit LLVM 3.0 veraltet ist.

Sobald man die g++-Befehle hat, um eine Bibliothek oder ein Programm zu erstellen, ist es ziemlich einfach, das Makefile auf clang++ umzustellen, wenn man damit zufrieden ist, alle clang++/LLVM-Aufrufe im all-Make-Target aufzulisten.

Hier ist die llvm.mk-Datei für LevelDB für Linux mit Snappy (kompilieren mit make -f llvm.mk):

llvm.mk
all:
    clang++ -emit-llvm -I. -I./include -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DSNAPPY -O2 -DNDEBUG -c db/builder.cc -o db/builder.bc
    clang++ -emit-llvm -I. -I./include -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DSNAPPY -O2 -DNDEBUG -c db/c.cc -o db/c.bc
    clang++ -emit-llvm -I. -I./include -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DSNAPPY -O2 -DNDEBUG -c db/dbformat.cc -o db/dbformat.bc
    clang++ -emit-llvm -I. -I./include -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DSNAPPY -O2 -DNDEBUG -c db/db_impl.cc -o db/db_impl.bc
    clang++ -emit-llvm -I. -I./include -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DSNAPPY -O2 -DNDEBUG -c db/db_iter.cc -o db/db_iter.bc
    clang++ -emit-llvm -I. -I./include -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DSNAPPY -O2 -DNDEBUG -c db/filename.cc -o db/filename.bc
    clang++ -emit-llvm -I. -I./include -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DSNAPPY -O2 -DNDEBUG -c db/log_reader.cc -o db/log_reader.bc
    clang++ -emit-llvm -I. -I./include -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DSNAPPY -O2 -DNDEBUG -c db/log_writer.cc -o db/log_writer.bc
    clang++ -emit-llvm -I. -I./include -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DSNAPPY -O2 -DNDEBUG -c db/memtable.cc -o db/memtable.bc
    clang++ -emit-llvm -I. -I./include -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DSNAPPY -O2 -DNDEBUG -c db/repair.cc -o db/repair.bc
    clang++ -emit-llvm -I. -I./include -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DSNAPPY -O2 -DNDEBUG -c db/table_cache.cc -o db/table_cache.bc
    clang++ -emit-llvm -I. -I./include -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DSNAPPY -O2 -DNDEBUG -c db/version_edit.cc -o db/version_edit.bc
    clang++ -emit-llvm -I. -I./include -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DSNAPPY -O2 -DNDEBUG -c db/version_set.cc -o db/version_set.bc
    clang++ -emit-llvm -I. -I./include -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DSNAPPY -O2 -DNDEBUG -c db/write_batch.cc -o db/write_batch.bc
    clang++ -emit-llvm -I. -I./include -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DSNAPPY -O2 -DNDEBUG -c table/block_builder.cc -o table/block_builder.bc
    clang++ -emit-llvm -I. -I./include -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DSNAPPY -O2 -DNDEBUG -c table/block.cc -o table/block.bc
    clang++ -emit-llvm -I. -I./include -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DSNAPPY -O2 -DNDEBUG -c table/filter_block.cc -o table/filter_block.bc
    clang++ -emit-llvm -I. -I./include -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DSNAPPY -O2 -DNDEBUG -c table/format.cc -o table/format.bc
    clang++ -emit-llvm -I. -I./include -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DSNAPPY -O2 -DNDEBUG -c table/iterator.cc -o table/iterator.bc
    clang++ -emit-llvm -I. -I./include -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DSNAPPY -O2 -DNDEBUG -c table/merger.cc -o table/merger.bc
    clang++ -emit-llvm -I. -I./include -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DSNAPPY -O2 -DNDEBUG -c table/table_builder.cc -o table/table_builder.bc
    clang++ -emit-llvm -I. -I./include -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DSNAPPY -O2 -DNDEBUG -c table/table.cc -o table/table.bc
    clang++ -emit-llvm -I. -I./include -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DSNAPPY -O2 -DNDEBUG -c table/two_level_iterator.cc -o table/two_level_iterator.bc
    clang++ -emit-llvm -I. -I./include -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DSNAPPY -O2 -DNDEBUG -c util/arena.cc -o util/arena.bc
    clang++ -emit-llvm -I. -I./include -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DSNAPPY -O2 -DNDEBUG -c util/bloom.cc -o util/bloom.bc
    clang++ -emit-llvm -I. -I./include -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DSNAPPY -O2 -DNDEBUG -c util/cache.cc -o util/cache.bc
    clang++ -emit-llvm -I. -I./include -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DSNAPPY -O2 -DNDEBUG -c util/coding.cc -o util/coding.bc
    clang++ -emit-llvm -I. -I./include -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DSNAPPY -O2 -DNDEBUG -c util/comparator.cc -o util/comparator.bc
    clang++ -emit-llvm -I. -I./include -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DSNAPPY -O2 -DNDEBUG -c util/crc32c.cc -o util/crc32c.bc
    clang++ -emit-llvm -I. -I./include -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DSNAPPY -O2 -DNDEBUG -c util/env.cc -o util/env.bc
    clang++ -emit-llvm -I. -I./include -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DSNAPPY -O2 -DNDEBUG -c util/env_posix.cc -o util/env_posix.bc
    clang++ -emit-llvm -I. -I./include -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DSNAPPY -O2 -DNDEBUG -c util/filter_policy.cc -o util/filter_policy.bc
    clang++ -emit-llvm -I. -I./include -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DSNAPPY -O2 -DNDEBUG -c util/hash.cc -o util/hash.bc
    clang++ -emit-llvm -I. -I./include -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DSNAPPY -O2 -DNDEBUG -c util/histogram.cc -o util/histogram.bc
    clang++ -emit-llvm -I. -I./include -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DSNAPPY -O2 -DNDEBUG -c util/logging.cc -o util/logging.bc
    clang++ -emit-llvm -I. -I./include -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DSNAPPY -O2 -DNDEBUG -c util/options.cc -o util/options.bc
    clang++ -emit-llvm -I. -I./include -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DSNAPPY -O2 -DNDEBUG -c util/status.cc -o util/status.bc
    clang++ -emit-llvm -I. -I./include -pthread -DOS_LINUX -DLEVELDB_PLATFORM_POSIX -DSNAPPY -O2 -DNDEBUG -c port/port_posix.cc -o port/port_posix.bc
    llvm-link -o libleveldb.bc db/builder.bc db/c.bc db/dbformat.bc db/db_impl.bc db/db_iter.bc db/filename.bc db/log_reader.bc db/log_writer.bc db/memtable.bc db/repair.bc db/table_cache.bc db/version_edit.bc db/version_set.bc db/write_batch.bc table/block_builder.bc table/block.bc table/filter_block.bc table/format.bc table/iterator.bc table/merger.bc table/table_builder.bc table/table.bc table/two_level_iterator.bc util/arena.bc util/bloom.bc util/cache.bc util/coding.bc util/comparator.bc util/crc32c.bc util/env.bc util/env_posix.bc util/filter_policy.bc util/hash.bc util/histogram.bc util/logging.bc util/options.bc util/status.bc port/port_posix.bc

Beachte den Aufruf von llvm-link zum Zusammenführen der IR-Dateien (.bc-Erweiterung). llvm-ld ist ein Linker, der ausführbare Dateien mit Bibliotheken linkt, während llvm-link IR-Dateien zusammenführt – sie sind nicht dasselbe.

Das Ergebnis ist libleveldb.bc, eine 576 kiB IR-Datei, verglichen mit der 688 kiB großen libleveldb.a (Git-Revision 514c943, 6. Feb 2013). libleveldb.so.1.9 ist jedoch nur 392 kiB groß.


Check out similar posts by category: C/C++, Databases, LLVM