Ich benutze LLVM api, um Bitcodedateien zu parsen. Ich habe das folgende Snippet und ich verwende diesen Befehl, um den Bitcode $CC -emit-llvm -c -g source.c
zu erzeugen, in dem CC auf den Pfad clang
gesetzt ist. einen numerischen Wert haben, basierend auf dem Typ des ParametersLLVMs Bitcode falsche Erkennung von Funktionsparametern
#include <stdio.h>
struct Point {
int a;
int b;
};
int func_0(struct Point p, int x) {
return 0;
}
The TypeID soll. Sowohl für die ganze Zahl x
als auch für die Struktur Point
erhalte ich den Wert 10
, der als TokenTyID
bezeichnet wird. Also entschied ich mich, die Funktionen isIntegerTy()
bzw. isStructTy()
zu verwenden, um zu sehen, ob ich zumindest in diesem Fall das richtige Ergebnis erhalte. Diese Lösung funktioniert für den Ganzzahlparameter x
, aber nicht für die Struktur. Wie kann ich Strukturen korrekt identifizieren und ihre Felder lesen?
Just, auf Vollständigkeit die Bitcode ich diesen Code verwenden, um zu analysieren:
using namespace llvm;
int main(int argc, char** argv) {
LLVMContext context;
OwningPtr<MemoryBuffer> mb;
MemoryBuffer::getFile(FileName, mb);
Module *m = ParseBitcodeFile(mb.get(), context);
for (Module::const_iterator i = m->getFunctionList().begin(), e = m->getFunctionList().end(); i != e; ++i) {
if (i->isDeclaration() || i->getName().str() == "main")
continue;
std::cout << i->getName().str() << std::endl;
Type* ret_type = i->getReturnType();
std::cout << "\t(ret) " << ret_type->getTypeID() << std::endl;
Function::const_arg_iterator ai;
Function::const_arg_iterator ae;
for (ai = i->arg_begin(), ae = i->arg_end(); ai != ae; ++ai) {
Type* t = ai->getType();
std::cout << "\t" << ai->getName().str() << " " << t->getTypeID()
<< "(" << t->getFunctionNumParams() << ")"
<< " is struct? " << (t->isStructTy() ? "Y" : "N")
<< " is int? " << (t->isIntegerTy() ? "Y" : "N")
<< "\n";
}
}
return 0;
}
ich diesen Beitrag Why does Clang coerce struct parameters to ints über die von klirren mit den Strukturen durchgeführt Übersetzung lesen, und ich bin mir ziemlich sicher, dass mein gleiches Problem .
Versucht, LLVM IR mit 'clang -S -emit-llvm' zu entladen? – arrowd
Ja, es funktioniert nicht so gut. Wenn ich den IR-Code mit der Option "-S" erzeuge und dann den Bitcode mit "llvm-as" erzeuge, ist das Problem das gleiche. – Surcle
Ich meine, versuchen Sie, generierte IR zu sehen und herauszufinden, in was Ihre Struktur verwandelt wird. – arrowd