Почему некоторые конструкторы не имеют этого выражения в качестве параметра в llvm IR? - PullRequest
0 голосов
/ 02 марта 2020

Я использовал clang для компиляции nodejs, и я обнаружил, что есть конструктор, у которого нет 'this' ptr в качестве параметра.

define internal fastcc void @_ZN2v84base11LeakyObjectINS_8internal12_GLOBAL__N_124PageAllocatorInitializerEEC2IJEEEDpOT_() unnamed_addr #4 align 2 {
entry:
  %this.addr = alloca %"struct.__gnu_cxx::__aligned_buffer"*, align 8
  store %"struct.__gnu_cxx::__aligned_buffer"* @_ZZN2v88internal12_GLOBAL__N_123GetPageTableInitializerEvE6object, %"struct.__gnu_cxx::__aligned_buffer"** %this.addr, align 8
  %this1 = load %"struct.__gnu_cxx::__aligned_buffer"*, %"struct.__gnu_cxx::__aligned_buffer"** %this.addr, align 8
  %storage_ = getelementptr inbounds %"struct.__gnu_cxx::__aligned_buffer", %"struct.__gnu_cxx::__aligned_buffer"* %this1, i32 0, i32 0
  %storage_2 = getelementptr inbounds %"struct.__gnu_cxx::__aligned_buffer", %"struct.__gnu_cxx::__aligned_buffer"* %this1, i32 0, i32 0
  %0 = bitcast %"union.std::aligned_storage<8, 8>::type"* %storage_2 to i8*
  %1 = bitcast i8* %0 to %"struct.std::_Head_base.44"*
  call fastcc void @_ZN2v88internal12_GLOBAL__N_124PageAllocatorInitializerC2Ev(%"struct.std::_Head_base.44"* %1)
  ret void
}

Я запутался, почему эта функция не имеет ptr 'this'?

Чтобы подтвердить, что эта функция является в точности конструктором, вот неоправданное имя ниже:

» c++filt _ZN2v84base11LeakyObjectINS_8internal12_GLOBAL__N_124PageAllocatorInitializerEEC2IJEEEDpOT_
v8::base::LeakyObject<v8::internal::(anonymous namespace)::PageAllocatorInitializer>::LeakyObject<>()

А вот исходный код этого класса:

template <typename T>
class LeakyObject {
 public:
  template <typename... Args>
  explicit LeakyObject(Args&&... args) {
    new (&storage_) T(std::forward<Args>(args)...);
  }

  T* get() { return reinterpret_cast<T*>(&storage_); }

 private:
  typename std::aligned_storage<sizeof(T), alignof(T)>::type storage_;

  DISALLOW_COPY_AND_ASSIGN(LeakyObject);
};
...