Как найти инструкцию по объявлению блокировки в 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
Спасибо большое! С вашей помощью решил проблему.Демо очень удобно!Тс! - 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