Если делать через ассемблериование, то вы частично теряете отладочную информацию.
Если с опцией -S смотреть в ассемблерный выхлоп (что я часто делаю), то там столько мишуры в виде отладочных макросов и символов видно (больше эффективного кода), что сомневаюсь, что там можно что-то потерять.
Непонятно даже зачем им убирать фазу ассемблера, ибо она компилируется мгновенно по сравнению с C/C++ и расходы на неё незначительны, чтобы её выкидывать, а ключ -S всё-равно делает её необходимой к реализации.
Так же если использовать директиву __asm и допустить внутри кода на ассемблере ошибку в ассемблерном коде, то прекрасно видно, что ошибки выводит процесс as так как __asm работает как макроподстановка текста с нехитрыми правилами для сшивания с имеющимся кодом и оптимизации (всегда балдел как элегантно эта штука у них работает).
В общем даже если эту фазу убрали в каких то случаях зачем то, то gcc всё равно ведет себя так как будто она есть и эту фазу можно всегда произвести явно - сгенерировать через -S файл .s и прогнав его через as получить бинарно идентичный файл как если бы компилировалось сразу через gcc. Сам проверял из любопытства пару лет назад на mingw.
Поэтому с одной стороны есть объективные факторы:
- простая реализация __asm
- совместимость со всеми тулчейном от ассемблера
Подозреваю что последнее было решающим фактором когда то на заре возникновения проекта, а потом в Си столько рюшечек появилось, что там скорее as уже прогнулся под сишку, чтобы поддерживать то, что ей надо для реализации.