#c #gcc #compiler-construction #backend
#c #gcc #компилятор-конструкция #серверная часть
Вопрос:
Я пытаюсь перенести gcc на новую цель. Цель — это новый процессор, который мы разработали самостоятельно с полным набором команд. Мы хотим иметь возможность компилировать код c в gcc для нашего нового процессора. Чтобы иметь возможность выполнить это, нам нужно портировать gcc для этой конкретной цели. Я прочитал некоторые документы gcc, как это сделать. До сих пор я редактировал / взломал существующую цель gcc и принял ее для нашей цели, что означает, что gcc будет генерировать ассемблерный код для нашего конкретного процессора. Итак, я использую gcc для компиляции gcc для этой новой цели. затем gcc сгенерирует компилятор myprocessor-gcc. Этот компилятор сможет генерировать ассемблерный код для нашей цели. используя мой компилятор, передайте ему следующее:
myprocessor-gcc test.c
test.c выглядит так:
void __main(void);
void main(void)
{
return;
}
void __main(void)
{
int i = 0;
int i2 = 1;
int i3 = 2;
i = i2 i3;
return;
}
gcc смог скомпилировать этот код и сгенерировал правильный язык ассемблера, который я ожидал.
Поэтому я разработал свою тестовую функцию, чтобы:
void __main(void)
{
int i = 0;
int i2 = 1;
int i3 = 2;
int i4 = 3;
i = i2 i3 i4;
return;
}
После этого gcc выдает ошибку сегментации. Я хочу отладить эту ошибку сегментации, мне нужны все отладочные отпечатки, которые может предоставить мне gcc. Поэтому, когда я набираю:
myprocessor-gcc test.c -g
Я хочу увидеть некоторые отладочные отпечатки, чтобы я мог отлаживать gcc внутренне. Извините, если я не понял, я уточню, если это все еще неясно.
Комментарии:
1. Покажите нам какой-нибудь код? Это ваш лично разработанный компилятор? Можем ли мы увидеть ваш CFG?
2. Я пытаюсь перенести gcc на мой 8-разрядный процессор с помощью дескрипторов компьютера, я фактически взламываю существующий дескриптор компьютера. Я смог создать некоторый ассемблерный код, но он ни в коем случае не завершен. Если бы я мог увидеть некоторые отладочные отпечатки, это было бы очень полезно, ../../configure —target=ag —prefix=location_for_my_compiler —enable-languages=»c». ag — это имя моего порта.
3. Мне действительно любопытно, для какой микросхемы предназначен этот компилятор и в какой компании вы работаете.
4. @DavidGrayson Это фишка, которую я и мои коллеги разрабатываем как хобби-проект. Мы моделируем чип в Logisim. Цель состоит в том, чтобы создать полнофункциональный процессор с компилятором C. Трудно заставить gcc принять тот факт, что процессор имеет только 8 бит и имеет только один общий регистр (накопитель). Если мои коллеги согласятся, мы, возможно, опубликуем этот проект в Интернете, процессор компилятор gcc. Не уверен, что там много энтузиастов чипа компилятора.
Ответ №1:
Вам нужно будет убедиться, что сам ваш кросс-компилятор был скомпилирован с -g
опцией, чтобы в нем были символы отладки. Затем запустите gdb myprocessor-gcc test.c
, чтобы увидеть, где происходит ошибка сегментации в вашем компиляторе. Вам нужно будет изучить некоторые команды gdb, такие как run
и where
.
Комментарии:
1. Я запускаю все это в cygwin, должен ли я тогда загрузить gdb? Как мне использовать опцию -g для создания кросс-компилятора. Я использую configure …, make, а затем выполняю установку. Похоже, ни один из них не принимает переключатель -g
2. Я понятия не имею, как загрузить gdb в cygwin, но я уверен, что вы можете понять это, или вы могли бы выполнить свою разработку на виртуальной машине Linux с помощью менеджера дистрибутивов / пакетов, с которым вы знакомы. Несколько проектов GNU, которые я рассмотрел, включают опцию -g по умолчанию, поэтому она может быть уже включена, но если нет, то сделайте что-то вроде
./configure --help
и найдите любую опцию, связанную с «debug». Я просто хотел указать на ошибку в вашем подходе, которая заключается в том, что вы пытались использовать-g
для компиляции встроенной программы, когда на самом деле вам действительно нужно отлаживать компилятор.3. Это опция,
-g
которую необходимо передать в gcc при компиляции кросс-компилятора; это не опцияmake
илиconfigure
, но, вероятноconfigure
, с ней связан флаг.4. Я не смог найти ни одного флага, но я подозревал, что он включен по умолчанию, я также добавил макрос в файл myprocessor.h, который является частью моего порта gcc. Предполагается, что этот макрос позволяет выполнять отладку, но не уверен, что он будет работать. Я скачал gdb для cygwin и нашел эту замечательную статью, которая поможет в отладке debugging-gcc-with-gdb