2016-11-22 3 views
0

Ich möchte die Zeigerwerte in LLVM IR analysieren.Wie vergleicht man Zeiger in LLVM-IR?

Wie in LLVM Value Class dargestellt,

Value ist eine sehr wichtige LLVM-Klasse. Es ist die Basisklasse aller Werte, die von einem Programm berechnet wurden und die als Operanden für andere Werte verwendet werden können. Value ist die Superklasse anderer wichtiger Klassen wie Instruction and Function. Alle Werte haben einen Typ. Type ist keine Unterklasse von Value. Einige Werte können einen Namen haben und gehören zu einigen Modulen. Durch Setzen des Namens auf den Wert wird die Symboltabelle des Moduls automatisch aktualisiert.

Um zu testen, ob ein Value ein Zeiger ist oder nicht, gibt es eine Funktion a->getType()->isPointerTy(). LLVM bietet auch eine LLVM PointerType class, jedoch gibt es keine direkte API, um die Werte von Zeigern zu vergleichen.

Also frage ich mich, wie diese Zeigerwerte zu vergleichen, um zu testen, ob sie gleich sind oder nicht. Ich weiß, es gibt AliasAnalysis, aber ich habe Zweifel an den AliasAnalysis Ergebnissen, also möchte ich es selbst validieren.

Antwort

2

Die schnelle Lösung ist IRBuilder::CreatePtrDiff zu verwenden. Dies berechnet den Unterschied zwischen den beiden Zeigern und gibt ein i64 Ergebnis zurück. Wenn die Zeiger gleich sind, ist dies Null, und anderenfalls wird es ungleich Null sein.

Es könnte übertrieben erscheinen, als CreatePtrDiff sehen eine zusätzliche Anstrengungen unternehmen, um das Ergebnis in Bezug auf die Anzahl von Elemente statt Anzahl von Bytes , aber aller Wahrscheinlichkeit nach, dass zusätzliche Division aus optimiert werden erhalten zu berechnen. Die andere Option besteht darin, eine ptrtoint-Anweisung mit einem angemessen großen Ergebnistyp wie i64 zu verwenden und dann einen Ganzzahlvergleich durchzuführen.

Von der Online-Referenz:

Value *  CreatePtrDiff (Value *LHS, Value *RHS, const Twine &Name="") 
Return the i64 difference between two pointer values, dividing out the size of the pointed-to objects.