Как получить сборочный эквивалент файла CPP, имеющего только шаблоны - PullRequest
3 голосов
/ 18 ноября 2010

У меня есть файл C ++, в котором есть только методы шаблона класса шаблона.Я попытался скомпилировать это с опцией -S.

Он генерирует файл .s, но в нем нет кода ассемблера, например:

.section        ".text",#alloc,#execinstr

.file   "eac_slist.C"
.xstabs ".stab.index","V=9.0;DBG_GEN=5.0.8;dm;cd;backend;ptf;ptx;ptk;ptr/vobs/eam;s;;P;R=5.8<<Sun C++ 5.8 2005/10/13 (ccfe)>>;A=2",60,0,0,0
.xstabs ".stab.index","/vobs/ossrc_3pp/freeware/studio11/SUNWspro/prod/bin/CC -I. -S  -xs  eac_slist.C",52,0,0,0

помощь в этом?

Ответы [ 3 ]

7 голосов
/ 18 ноября 2010

Шаблон преобразуется в код только при создании экземпляра этого шаблона.Вы не получите asm для шаблона, если не создадите его экземпляр.

Однако вы можете попросить компилятор подробно объяснить экземпляры шаблона:

template class TemplatedClass<char>;

Если вы разместите такойВ строке c вашего файла вы получите asm, сгенерированный для char варианта вашего шаблона.


Отладка обновления кода шаблона

Похоже, ваш реальныйВопрос в том, как узнать, в какой строке кода моего кода произошла ошибка моей программы?

Звучит так, как будто у вас есть файл ядра, вы точно указали адрес, посмотрели сборку по этому адресу и теперь хотите узнать, что означает эта сборка.

Ваш план состоит в том, чтобыПерекомпилируйте шаблон самостоятельно и найдите соответствующий участок ассемблера.

Ваше решение не будет работать

  1. необходимо создать экземпляры для определенного типа, иначе они не скомпилируют
  2. сгенерированный кодбудет часто отличаться для каждого типа, выбранного в (1)
  3. код шаблона обычно компилируется несколько раз в программе, каждый раз в модуле компиляции вызывающей функции шаблона.
  4. Из-за вышеизложенного вы не найдете точного соответствия для кода сбойной сборки.

Ваше решение не требуется

Я предполагаю, что вы можете повторитьсбой (т. е. это не файл ядра клиента, который вы просматриваете).

Добавляя символы -g к аргументам gcc при каждой компиляции, вы сможете определить, на какой строке произошел сбой программы.

Сделайте это, затем снова приведите к сбою.

Я не скажу, что отладка шаблонов проста, но не легче, чем это.

2 голосов
/ 18 ноября 2010

Вы не можете скомпилировать шаблон. Поскольку название предполагает, что шаблон является неполным кодом, вам необходимо создать его экземпляр с некоторыми аргументами типа, прежде чем его можно будет скомпилировать в машинный код.

Попробуйте скомпилировать некоторый код, который использует шаблон. В зависимости от аргументов типа сгенерированный код может отличаться.

1 голос
/ 18 ноября 2010

Если вы на самом деле не используете шаблонный код, компилятору не требуется ничего производить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...