Вопрос:

Получение и использование инструкции llvm

c++ llvm dead-code

1165 просмотра

2 ответа

1772 Репутация автора

Я пытаюсь провести анализ живучести и для того , чтобы сделать это мне нужно для получения defи useнаборы для всех моих узлов, где они определены следующим образом :

def[n] = set of all variables defined at node n

use[n] = set of all variables used at node n

Так, например, в строке:

a = b + c

def[n] = {a}

use[n] = {b,c}

Как я могу это сделать?

Автор: Alk Источник Размещён: 09.01.2018 04:40

Ответы (2)


2 плюса

29 Репутация автора

http://llvm.org/docs/ProgrammersManual.html#iterating-over-def-use-use-def-chains

Я надеюсь, что эта страница может помочь вам. Пользовательские объекты, которые обращаются к методам user_begin (), user_end () и users () в объекте Value, являются объектами, которые используют объект Value. Класс Instruction является подклассом класса User.

Я могу ошибаться, но чтобы получить набор def-use на уровне IR, элементами набора должны быть объекты Value, а каждый узел должен быть объектом Instruction.
Таким образом, def, установленный для каждого узла, будет объектом Value, возвращаемым инструкцией (возможен случай, когда инструкция не возвращается. И в этом случае def set является пустым набором.), А набор использования будет Пользовательский объект доступен через user_iterator инструкции .

Автор: WON Размещён: 11.01.2018 04:12

0 плюса

798 Репутация автора

По сути, когда мы определяем локальную переменную в LLVM, она использует AllocaInst. Вот пример, который вы подняли:

a=b+c

в коде C:

int a;
int b=10;
int c=10;
a=b+c;

В LLVM IR скомпилировано с -g(режим отладки):

%a = alloca i32, align 4
%b = alloca i32, align 4
%c = alloca i32, align 4
call void @llvm.dbg.declare(metadata i32* %a, metadata !14, metadata !16),
... !dbg !17
call void @llvm.dbg.declare(metadata i32* %b, metadata !18, metadata !16),
... !dbg !19
store i32 10, i32* %b, align 4, !dbg !19
call void @llvm.dbg.declare(metadata i32* %c, metadata !20, metadata !16),
... !dbg !21
store i32 10, i32* %c, align 4, !dbg !21
%0 = load i32, i32* %b, align 4, !dbg !22
%1 = load i32, i32* %c, align 4, !dbg !23
%add = add nsw i32 %0, %1, !dbg !24
store i32 %add, i32* %a, align 4, !dbg !25

Давайте посмотрим, как использовать API LLVM для сбора цепочек def-use. Это просто, поскольку LLVM имеет встроенный встроенный API на уровне функций для этого:

bool runOnFunction(Function &F){
    errs() << "digraph " + F.getName() + "{\n";
    errs() << "\n";
    for (auto block = F.getBasicBlockList().begin(); block != F.getBasicBlockList().end(); block++) {
        for (auto inst = block->begin(); inst != block->end(); inst++) {
            for (Use &U:inst->operands()) {
                Value *v = U.get();
                if (dyn_cast<Instruction>(v)) {
                    errs() << "\"" << *dyn_cast<Instruction>(v) << "\"" << " -> " << "\"" << *inst << "\"" << ";\n";
                }
                if (v->getName() != "") {
                    errs() << "\"" << v->getName() << "\"" << " -> " << "\"" << *inst << "\"" << ";\n";
                    errs() << "\"" << v->getName() << "\"" << " [ color = red ]\n";
                }
            }
        }
    }
    errs() << "\n}\n";
}

Для цепочек def-use, простых путей и пользователей.

Это сгенерирует PDG.

Код взят из https://github.com/DengMinghua/LLVM-Program-Dependency-Graph-Generator

Надеюсь это поможет.

Автор: Bernard Nongpoh Размещён: 12.01.2018 10:59
Вопросы из категории :
32x32