Skip to content

other_c2 bug env

ceragon edited this page Dec 13, 2021 · 2 revisions

关于 env

通过调用栈的分析,可以得出使用哪种方式构造的 env

定位

  1. 调用栈的其中一个信息是 CompileBroker::compiler_thread_loop()
void CompileBroker::compiler_thread_loop() {
    if (!ciObjectFactory::is_initialized()) {
       ciObjectFactory::initialize();
    }
}
  1. 再继续查看 initialize 的调用
void ciObjectFactory::initialize() {
    Arena* arena = new (mtCompiler) Arena(mtCompiler);
    ciEnv initial(arena);
    ciEnv* env = ciEnv::current();
}
  1. 再看一下 initial 这一行代码,这种写法的意思在调用 ciEnv 的一个单参构造函数
ciEnv::ciEnv(Arena* arena) : _ciEnv_arena(mtCompiler) {
  CompilerThread* current_thread = CompilerThread::current();
  current_thread->set_env(this);
}
  1. 上面方法将 env 存在了编译线程的一个成员变量上

Clone this wiki locally