GOAL P2: SPEC 에서 죽은 C 백엔드를 걷어낸다
파이프라인은 .fe → i386 asm → wasm → wlink → .exe 인데 명세는 아직 C 를 방출하는 컴파일러를 서술하고 있었다. 외부 감사가 그 문서를 충실히 읽고 존재하지 않는 문제(C 의 부호 있는 오버플로 UB)를 보고했다 -- 명세가 거짓말을 하면 그것을 읽는 사람이 틀린 답을 낸다. 걷어낸 것: .fei 심볼 파일과 그 위에 얹힌 증분 빌드 서술, fe_errors.h, --emit-c 와 --error-table, '호스트 C 방출', 'C 방출 시 static inline', '별도 C 표현'. 오류 코드 절은 실제대로 다시 썼다: 빌드 하나가 모든 유닛의 소스를 함께 읽고, 드라이버가 emit 전에 쓰인 이름을 모아 철자순으로 1부터 매긴다. 유닛 하나만 따로 코드 생성까지 밀고 갈 수 없다는 것도 그 결과로 적었다. R7 이 컴파일러 소스 파일 이름(own.c)을 대고 있던 것도 언어의 말로 바꿨고, 이동은 변수 단위이고 대여는 place 단위라는 구분을 붙였다. --target= 과 --model= 은 드라이버에서 없앴다. 타깃이 하나인데 받아들여서 무시하는 플래그는 안 받는 것보다 나쁘다. SPEC 이 약속만 하고 구현이 없는 것 셋을 TODO 에 적었다: --strip-error-names, fmt.fmt_error, 0b/0o 리터럴 값 계산. 240/240, 35/35.
This commit is contained in:
+4
-1
@@ -60,7 +60,10 @@ int main(int argc, char **argv)
|
||||
else if(strcmp(argv[i],"-o")==0 && i+1<argc) out_path=argv[++i];
|
||||
else if(strncmp(argv[i],"--std=",6)==0) std_root=argv[i]+6;
|
||||
else if(strcmp(argv[i],"--no-checks")==0) no_checks=1;
|
||||
else if(strncmp(argv[i],"--target=",9)==0 || strncmp(argv[i],"--model=",8)==0 || strcmp(argv[i],"--strip-error-names")==0) { }
|
||||
/* One target (SPEC 2), so --target= and --model= are gone: a flag
|
||||
that is accepted and does nothing is worse than one that is not
|
||||
accepted at all. */
|
||||
else if(strcmp(argv[i],"--strip-error-names")==0) { }
|
||||
else if(argv[i][0]!='-') file=argv[i];
|
||||
else if(strcmp(argv[i],"--help")==0){usage();return 0;}
|
||||
else {fprintf(fe_diag_stream(),"fec: unknown option %s\n",argv[i]);return 2;}
|
||||
|
||||
Reference in New Issue
Block a user