Экспорт классов C ++ в LLVM битовый код - PullRequest
1 голос
/ 23 июня 2011

Есть ли возможность скомпилировать класс C ++ в LLVM-битовый код?Всякий раз, когда я компилирую класс, подобный этому

class MyClass {
public:
MyClass {};
int i() { return 0; };
};

, используя clang -emit-llvm -c MyClass.cpp -o MyClass.bc, полученный битовый код кажется пустым: llvm-nm MyClass.bc ничего не возвращает.

Есть ли способ сделать эторабота?

Ура,

Мануэль

1 Ответ

5 голосов
/ 23 июня 2011

nm ничего не возвращает, потому что вы не создаете экземпляры каких-либо объектов.Весь ваш код оптимизирован.Добавьте это к своему коду, и вы увидите, что оно построено:

class MyClass {
public:
    MyClass() {};
    int i() { return 0; };
    int j(int x);
};

int MyClass::j(int x) {
    return x + 2;
}

Теперь у вас есть что построить

$ clang -emit-llvm -c class.cpp
$ nm class.o
---------------- T __ZN7MyClass1jEi
$ clang -emit-llvm -S class.cpp
$ cat class.s
; ModuleID = 'class.cpp'
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
target triple = "x86_64-apple-macosx10.6.7"

%class.MyClass = type { i8 }

define i32 @_ZN7MyClass1jEi(%class.MyClass* %this, i32 %x) nounwind ssp align 2 {
  %1 = alloca %class.MyClass*, align 8
  %2 = alloca i32, align 4
  store %class.MyClass* %this, %class.MyClass** %1, align 8
  store i32 %x, i32* %2, align 4
  %3 = load %class.MyClass** %1
  %4 = load i32* %2, align 4
  %5 = add nsw i32 %4, 2
  ret i32 %5
}
...