导出C++;类到LLVM位代码 < >是否有可能将C++类编译成LLVM位代码? 每当我编译这样的类时 class MyClass { public: MyClass {}; int i() { return 0; }; };

导出C++;类到LLVM位代码 < >是否有可能将C++类编译成LLVM位代码? 每当我编译这样的类时 class MyClass { public: MyClass {}; int i() { return 0; }; };,llvm,clang,Llvm,Clang,使用clang-emit llvm-c MyClass.cpp-o MyClass.bc生成的位代码文件似乎为空:llvm nm MyClass.bc不返回任何内容 有什么办法可以让这一切顺利进行吗 干杯 Manuel不会返回任何内容,因为您没有实例化任何对象。你的整个代码都优化了。将此添加到代码中,您将看到它已生成: class MyClass { public: MyClass() {}; int i() { return 0; }; int j(int x); };

使用
clang-emit llvm-c MyClass.cpp-o MyClass.bc
生成的位代码文件似乎为空:
llvm nm MyClass.bc
不返回任何内容

有什么办法可以让这一切顺利进行吗

干杯


Manuel不会返回任何内容,因为您没有实例化任何对象。你的整个代码都优化了。将此添加到代码中,您将看到它已生成:

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
}

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
}

您所有的方法都是内联的(因为它们是在类中定义的),可能这导致没有生成代码?为什么您认为它们是内联的?内联到什么?当你把一个函数体放在类声明中时,编译器会尝试内联它。它的内联是空的。设置为内联的函数本身不会生成代码。这种代码的内容被插入到调用代码中。你没有调用代码,所以没有生成代码。你所有的方法都是内联的(因为它们是在类中定义的),也许这会导致没有生成代码?为什么你认为它们是内联的?内联到什么?当你把一个函数体放在类声明中时,编译器会尝试内联它。它的内联是空的。设置为内联的函数本身不会生成代码。这种代码的内容被插入到调用代码中。您没有调用代码,因此没有生成代码。好吧,奇怪!但是你是对的,这段代码编译:
classrectangulargrid{public:RectangularGrid(){};inti();};int RectangularGrid::i(){return 0;}好的,奇怪!但是你是对的,这段代码编译:
classrectangulargrid{public:RectangularGrid(){};inti();};int RectangularGrid::i(){return 0;}