Дамп-макет памяти объекта C ++ не работает в Clang - PullRequest
0 голосов
/ 24 июня 2018

Я прочитал статью о сбросе макета памяти объекта C ++ с помощью Clang , и теперь я пытаюсь поиграть с этой функцией.Я создал два класса:

// simple.cpp
struct Base
{
    int value;
};

struct Derived : Base
{
    int count;
};

int main(int argc, char* argv[])
{
    return 0;
}

и выполнил следующую команду:

$ clang -cc1 -fdump-record-layouts-simple simple.cpp

и ничего не получил.версия clang:

$ clang++ -dumpversion
4.2.1

Если я запускаю следующую команду:

$ clang -cc1 --help

и среди множества сведений я могу найти такую:

...
  -fdump-record-layouts-simple
                          Dump record layout information in a simple form used for testing
  -fdump-record-layouts   Dump record layout information
  -fdump-vtable-layouts   Dump the layouts of all vtables that will be emitted in a translation unit
...

ЧтоЯ не так делаю?

1 Ответ

0 голосов
/ 24 июня 2018

Вам нужно сделать два изменения:

  1. Добавьте переключатель компилятора -emit-llvm. Без этого вывод LLVM не требуется, поэтому макеты записей никогда не вычисляются и поэтому не выводятся.
  2. Используйте классы в вашем коде. Если классы никогда не используются, генерация кода для них не производится, и их макеты не выводятся.

После внесения этих изменений вывод, как этот, печатается на стандартный вывод:

*** Dumping AST Record Layout
Type: struct Base

Layout: <ASTRecordLayout
  Size:32
  DataSize:32
  Alignment:32
  FieldOffsets: [0]>

*** Dumping AST Record Layout
Type: struct Derived

Layout: <ASTRecordLayout
  Size:64
  DataSize:64
  Alignment:32
  FieldOffsets: [32]>

...

Layout: <CGRecordLayout
  LLVMType:%struct.Base = type { i32 }
  NonVirtualBaseLLVMType:%struct.Base = type { i32 }
  IsZeroInitializable:1
  BitFields:[
]>

Layout: <CGRecordLayout
  LLVMType:%struct.Derived = type { %struct.Base, i32 }
  NonVirtualBaseLLVMType:%struct.Derived = type { %struct.Base, i32 }
  IsZeroInitializable:1
  BitFields:[
]>
...