Как строить дебажную инфу для отладки макросов?
От: T4r4sB Россия  
Дата: 23.06.20 17:05
Оценка:
На самом деле вопрос не по С++, а скорее по LLVM, но мне кажется, что по смыслу лучше задать именно здесь.

hello.h:
extern"C" int f(int i);

#define F(x) f(\
f(\
f(\
f(\
x))))


hello.cpp:
#include "hello.h"
 
int main(int argc, char** argv)
{
  int x=F(42);
  return x+5;
}

Далее
clang hello.cpp -o hello.ll -S -emit-llvm  -target i386-pc-windows -g

В лл вижу
%7 = call i32 @f(i32 42), !dbg !19
  %8 = call i32 @f(i32 %7), !dbg !19
  %9 = call i32 @f(i32 %8), !dbg !19
  %10 = call i32 @f(i32 %9), !dbg !19



то есть всё тело макроса относится к одной дебаг локации
Это значит, что я не могу поставить брекпоинт внутрь макроса в любое место.

На самом деле я сто лет не писал на крестах, я принимаю участие в разработке собственного убийцы С++, где такое макропрограммирование вовсю используется в метапрограммировании наряду с шаблонами, статической генерацией текста программы итд.
И я не знаю, как мне генерить дебаг инфу.

Я при развороте тела макроса честно прописываю строку и колонну каждого токена. Но если макрос находится в другом файле, то отладчик итерируется по линиям и колоннам не того файла, в котором макрос, а того файла, который вызвал макрос. Потому что codeview (мне нужен именно он, так как мсвс) не позволяет задавать каждой инструкции свой файл.

Если ли компилятор/отладчик, который позволяет ставить брекпоинты внутри макроса? И как выглядит его отладочная инфа?
Как в том же D выглядит отладка кода, находящегося в сгенерированной строке?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.