[devel] re-writing GNU C extensions (part1)
Ivan Zakharyaschev
imz на altlinux.org
Пн Янв 11 21:21:45 MSK 2016
Вот продолжение -- промежуточный этап (пока не очень полезный)
создания переписывателя GNU C extensions.
На этом этапе он должен ставить вложенные функции на верхний уровень
(без какой-либо проверки и переписывания параметров и т.п.; но с точки
зрения внутреннего устройства это приближает к реализации цели).
Представлен в репозитории:
http://hub.darcs.net/imz/language-c_1_process_analyze-printAST
(1 -- по номеру сообщения; в предыдущем сообщении уже было в основном
описано, как производить его запуск и пр. это сообщение сохранено как
[ann1.md](http://hub.darcs.net/imz/cuglify/browse/ann1.md).)
Сборка:
=======
На этот раз изменённую библиотеку стоит поставить в свой отдельный
sandbox, собрать с ней examples/Process (в этом случае такой порядок
действий darcs проверен, а при другом можно наткнуться на
неприятности, к сожаленью):
[imz на vb2 ~]$ cd public/cuglify-WIP/
[imz на vb2 cuglify-WIP]$ darcs clone language-c_process_analyze-printAST
language-c_1_process_analyze-printAST
[imz на vb2 cuglify-WIP]$ cd language-c_1_process_analyze-printAST
[imz на vb2 language-c_1_process_analyze-printAST]$ darcs pull -a
http://hub.darcs.net/imz/language-c_1_process_analyze-printAST
[imz на vb2 language-c_1_process_analyze-printAST]$ cabal sandbox init
[imz на vb2 language-c_1_process_analyze-printAST]$ cabal install
[imz на vb2 language-c_1_process_analyze-printAST]$ cabal exec -- make -C
examples Process
Тестирование:
=============
[imz на vb2 language-c_1_process_analyze-printAST]$ cd ../cuglify/
[imz на vb2 cuglify]$ ./run-tests.sh
../language-c_1_process_analyze-printAST/examples/Process
PROCESSING ex-nested.c...
* with gcc -c:
0
* with ../language-c_1_process_analyze-printAST/examples/Process:
int g(int x)
{
return b + x + a;
}
void f(int a)
{
int b = 5;
g(0);
g(1);
g(2);
}
0
* diff against gcc -E:
--- /dev/fd/63 2016-01-11 21:09:08.920889328 +0300
+++ /dev/fd/62 2016-01-11 21:09:08.920889328 +0300
@@ -1,11 +1,10 @@
-# 1 "ex-nested.c"
-# 1 "<command-line>"
-# 1 "ex-nested.c"
-void f(int a) {
- int b = 5;
- int g(int x) {
+int g(int x)
+{
return b + x + a;
- }
+}
+void f(int a)
+{
+ int b = 5;
g(0);
g(1);
g(2);
TEST OK on ex-nested.c
PROCESSING ex-nested_typemismatch.c...
* with gcc -c:
ex-nested_typemismatch.c: In function ‘f’:
ex-nested_typemismatch.c:7:4: error: called object ‘b’ is not a
function
1
* with ../language-c_1_process_analyze-printAST/examples/Process:
Process: user error (ex-nested_typemismatch.c:7: (column 3) [ERROR]
>>> AST invariant violated
attempt to call non-function of type int
)
1
TEST OK on ex-nested_typemismatch.c
PROCESSING ex-nested_undef.c...
* with gcc -c:
0
* with ../language-c_1_process_analyze-printAST/examples/Process:
ex-nested_undef.c:7: (column 3) [WARNING] >>> AST invariant violated
unknown function: h
int g(int x)
{
return b + x + a;
}
void f(int a)
{
int b = 5;
g(0);
h(1);
g(2);
}
0
* diff against gcc -E:
ex-nested_undef.c:7: (column 3) [WARNING] >>> AST invariant violated
unknown function: h
--- /dev/fd/63 2016-01-11 21:09:09.069878241 +0300
+++ /dev/fd/62 2016-01-11 21:09:09.070878166 +0300
@@ -1,11 +1,10 @@
-# 1 "ex-nested_undef.c"
-# 1 "<command-line>"
-# 1 "ex-nested_undef.c"
-void f(int a) {
- int b = 5;
- int g(int x) {
+int g(int x)
+{
return b + x + a;
- }
+}
+void f(int a)
+{
+ int b = 5;
g(0);
h(1);
g(2);
TEST OK on ex-nested_undef.c
PROCESSING ex-nested-with-id-collisions.c...
* with gcc -c:
ex-nested-with-id-collisions.c: In function ‘g’:
ex-nested-with-id-collisions.c:10:5: warning: return makes integer
from pointer without a cast [enabled by default]
0
* with ../language-c_1_process_analyze-printAST/examples/Process:
void f(int x);
void g(int x);
void h(int x);
int b = 11;
int g(int x)
{
return f + x + a;
}
void f(int a)
{
int b = 5;
g(0);
g(1);
g(2);
}
void f(int y);
void g(int y);
void h(int y);
0
* diff against gcc -E:
--- /dev/fd/63 2016-01-11 21:09:09.178870130 +0300
+++ /dev/fd/62 2016-01-11 21:09:09.178870130 +0300
@@ -1,23 +1,18 @@
-# 1 "ex-nested-with-id-collisions.c"
-# 1 "<command-line>"
-# 1 "ex-nested-with-id-collisions.c"
void f(int x);
void g(int x);
void h(int x);
-
int b = 11;
-
-void f(int a) {
- int b = 5;
- int g(int x) {
+int g(int x)
+{
return f + x + a;
- }
-
+}
+void f(int a)
+{
+ int b = 5;
g(0);
g(1);
g(2);
}
-
void f(int y);
void g(int y);
void h(int y);
TEST OK on ex-nested-with-id-collisions.c
[imz на vb2 cuglify]$
Вопросы:
========
Остаются вопросы помимо реализации задуманного преобразования, как я
писал, про встройку программы с таким интерфейсом в gcc, clang и т.п.,
обнаружение ошибок.
Best regards,
Ivan
Подробная информация о списке рассылки Devel