Кто-нибудь ковырялся с Emscripten?
В общем "Здравствуй, мир!" оно компилит хорошо.
А как с чем-нибудь посложнее?
#include <stdio.h>
int main()
{
char name[10];
printf("1: ");
scanf("%9s", name);
printf("1. Is instruction ordering ok, <%s>?\n", name);
printf("2: ");
scanf("%9s", name);
printf("2. Still ok, <%s>? =)\n", name);
return 0;
}
А так: выдаётся JavaScript, который сперва всё печатает, а потом радостно спрашивает то, что его попросили в scanf
, причём один раз.
Разумно предположить, что это у меня руки кривые и я как-то неправильно Emscripten поставил ил запускаю. Ок, генерю LLVM-код при помощи CLang:
; ModuleID = 'test.c'
target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32-S32"
target triple = "i386-pc-cygwin"
@.str = private unnamed_addr constant [4 x i8] c"1: \00", align 1
@.str1 = private unnamed_addr constant [4 x i8] c"%9s\00", align 1
@.str2 = private unnamed_addr constant [38 x i8] c"1. Is instruction ordering ok, <%s>?\0A\00", align 1
@.str3 = private unnamed_addr constant [4 x i8] c"2: \00", align 1
@.str4 = private unnamed_addr constant [23 x i8] c"2. Still ok, <%s>? =)\0A\00", align 1
define i32 @main() nounwind {
%1 = alloca i32, align 4
%name = alloca [10 x i8], align 1
store i32 0, i32* %1
%2 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str, i32 0, i32 0))
%3 = getelementptr inbounds [10 x i8]* %name, i32 0, i32 0
%4 = call i32 (i8*, ...)* @scanf(i8* getelementptr inbounds ([4 x i8]* @.str1, i32 0, i32 0), i8* %3)
%5 = getelementptr inbounds [10 x i8]* %name, i32 0, i32 0
%6 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([38 x i8]* @.str2, i32 0, i32 0), i8* %5)
%7 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([4 x i8]* @.str3, i32 0, i32 0))
%8 = getelementptr inbounds [10 x i8]* %name, i32 0, i32 0
%9 = call i32 (i8*, ...)* @scanf(i8* getelementptr inbounds ([4 x i8]* @.str1, i32 0, i32 0), i8* %8)
%10 = getelementptr inbounds [10 x i8]* %name, i32 0, i32 0
%11 = call i32 (i8*, ...)* @printf(i8* getelementptr inbounds ([23 x i8]* @.str4, i32 0, i32 0), i8* %10)
ret i32 0
}
declare i32 @printf(i8*, ...)
declare i32 @scanf(i8*, ...)
Код нормально работает при помощи lli
, компилится в нормальный ассемблер при помощи llc
, в общем код ок.
Запускаю его при помощи вот этой демо-странички от Emscripten. Получаю, что характерно, аналогичную кривость, но почти наоборот, попробуйте сами.
ЧЯДНТ?