Как да открия инструкцията за деклариране на заключване в llvm?

Аз съм нов в llvm и се опитвах да намеря декларация за заключване и след това да направя някаква работа с инструменти, кодът като този:

#include <iostream>
#include <thread>
#include <mutex>
using namespace std;

int share = 42;
mutex m;

void f()
{
    m.lock();
    --share;
    cout << "function f -> share: " << share << '\n';
    m.unlock();
}



int main()
{
    thread thf{f};

    thf.join();

    return 0;
}

Искам да намеря инструкцията за деклариране на заключване, напр.: mutex m; инструментът llvm преминава така:

struct SkeletonPass : public FunctionPass {
static char ID;
SkeletonPass() : FunctionPass(ID) {}

virtual bool runOnFunction(Function &F) {
  // Get the function to call from our runtime library.
  LLVMContext &Ctx = F.getContext();
  Constant *logFunc = F.getParent()->getOrInsertFunction(
    "logop", Type::getVoidTy(Ctx), Type::getInt32Ty(Ctx), NULL
  );

  for (auto &B : F) {
    for (auto &I : B) {
      ***if ((&I) is lock declaration instruction)*** { 

        // Insert something *after* `op`.
        IRBuilder<> builder(op);
        builder.SetInsertPoint(&B, ++builder.GetInsertPoint());

        // Insert a call to function.

        builder.CreateCall(logFunc, ConstantInt::get(Type::getInt32Ty(Ctx), 2));

        return true;
      }
    }
  }

Накратко, можете ли да ми кажете как да открия инструкцията за деклариране на заключване, благодаря!


person Yu.h    schedule 06.03.2016    source източник


Отговори (2)


Декларацията ще изглежда като глобална, така че трябва да напишете пропуск на модул, за да го намерите, а не пропуск на функция. Трябва да изглежда като нещо като:

@m = global %mutex zeroinitializer

Всъщност, използвайки демонстрацията на http://ellcc.org/demo/index.cgi за опитайте това, наистина можете да видите, че:

...    
%"class.std::__1::mutex" = type { %struct.pthread_mutex_t }
%struct.pthread_mutex_t = type { %union.anon }
%union.anon = type { [5 x i8*] }
...
@m = global %"class.std::__1::mutex" zeroinitializer, align 8
person Oak    schedule 07.03.2016
comment
Благодаря ви много! С ваша помощ реших проблема. Демото е много удобно!Ths! - person Yu.h; 09.03.2016
comment
Имам друг въпрос във връзка. Мисля, че трябва да знаете как да го разрешите. Можете ли да ми кажете как да го направя, ако знаете. Благодаря ти ! - person Yu.h; 09.03.2016

Можете да използвате CppBackend на LLVM, за да компилирате своя код. Това ще създаде C++ код, който съставлява изходния код. След това можете лесно да разберете как mutex m; дефиницията е конструирана чрез LLVM API.

Стартирайте clang -march=cpp foo.cpp, за да използвате CppBackend. Като алтернатива можете да използвате тази демонстрационна страница, за да компилирате своя код онлайн.

person arrowd    schedule 07.03.2016