std: 표준 라이브러리가 컴파일러 옆에서 해석되고 호출된다
std 는 예약된 이름이고 프로그램이 아니라 컴파일러와 함께 있으므로 자기 루트를 갖는다 (--std=). 본문 없는 선언은 링커가 찾을 것 -- 런타임이나 C 라이브러리 -- 이므로 IR 에 extern 으로 나간다. 런타임에 write/alloc/free/exit 를 넣었다. 이것이 표준 라이브러리가 스스로 말할 수 없는 전부이고 나머지는 Ferro 로 쓴다. @trap @unreachable @size_of @align_of @line 을 내린다. 링크 이름에서 점과 괄호를 걸렀다. 유닛 경로에는 점이 있고 제네릭 인스턴스에는 괄호가 있는데 어셈블러가 받지 않는다.
This commit is contained in:
@@ -154,11 +154,15 @@ static FeType *node_type(FeCheck *c, FeNode *n)
|
||||
return t;
|
||||
}
|
||||
|
||||
/* A link-visible name. A unit path has dots in it and a generic instance has
|
||||
brackets and commas, none of which an assembler will accept, so everything
|
||||
outside the portable identifier set becomes an underscore. */
|
||||
static char *unit_cname(FeCheck *c, const char *name)
|
||||
{
|
||||
char *u;
|
||||
char *p;
|
||||
unsigned long n;
|
||||
unsigned long i;
|
||||
u = c->ast->root && c->ast->root->text ? c->ast->root->text : "unit";
|
||||
n = (unsigned long)strlen("fe_") + (unsigned long)strlen(u) +
|
||||
(unsigned long)strlen(name ? name : "name") + 2UL;
|
||||
@@ -168,6 +172,12 @@ static char *unit_cname(FeCheck *c, const char *name)
|
||||
strcat(p, u);
|
||||
strcat(p, "_");
|
||||
strcat(p, name ? name : "name");
|
||||
for (i = 0; p[i]; ++i) {
|
||||
char ch = p[i];
|
||||
if (!((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') ||
|
||||
(ch >= '0' && ch <= '9') || ch == '_'))
|
||||
p[i] = '_';
|
||||
}
|
||||
return p;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user