From 01efb4005b5d65e9e795198adaa141719d6b6f81 Mon Sep 17 00:00:00 2001 From: Aleksander Guryanov Date: Thu, 21 Mar 2013 21:27:00 +0700 Subject: [PATCH 01/38] Offsets test --- tests/runner.py | 78 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) diff --git a/tests/runner.py b/tests/runner.py index db33c81793145..fc58e38663642 100755 --- a/tests/runner.py +++ b/tests/runner.py @@ -11040,6 +11040,84 @@ def test_sdl_mouse(self): Popen([PYTHON, EMCC, os.path.join(self.get_dir(), 'sdl_mouse.c'), '-O2', '--minify', '0', '-o', 'page.html', '--pre-js', 'pre.js']).communicate() self.run_browser('page.html', '', '/report_result?740') + def test_sdl_mouse_offsets(self): + open(os.path.join(self.get_dir(), 'pre.js'), 'w').write(''' + function simulateMouseEvent(x, y, button) { + var event = document.createEvent("MouseEvents"); + if (button >= 0) { + var event1 = document.createEvent("MouseEvents"); + event1.initMouseEvent('mousedown', true, true, window, + 1, x, y, x, y, + 0, 0, 0, 0, + button, null); + Module['canvas'].dispatchEvent(event1); + var event2 = document.createEvent("MouseEvents"); + event2.initMouseEvent('mouseup', true, true, window, + 1, x, y, x, y, + 0, 0, 0, 0, + button, null); + Module['canvas'].dispatchEvent(event2); + } else { + var event1 = document.createEvent("MouseEvents"); + event1.initMouseEvent('mousemove', true, true, window, + 0, x, y, x, y, + 0, 0, 0, 0, + 0, null); + Module['canvas'].dispatchEvent(event1); + } + } + window['simulateMouseEvent'] = simulateMouseEvent; + ''') + open(os.path.join(self.get_dir(), 'page.html'), 'w').write(''' + + + + + +
+ +
+ + + + + + ''') + open(os.path.join(self.get_dir(), 'sdl_mouse.c'), 'w').write(self.with_report_result(open(path_from_root('tests', 'sdl_mouse.c')).read())) + + Popen([PYTHON, EMCC, os.path.join(self.get_dir(), 'sdl_mouse.c'), '-O2', '--minify', '0', '-o', 'sdl_mouse.js', '--pre-js', 'pre.js']).communicate() + self.run_browser('page.html', '', '/report_result?600') + def test_sdl_audio(self): shutil.copyfile(path_from_root('tests', 'sounds', 'alarmvictory_1.ogg'), os.path.join(self.get_dir(), 'sound.ogg')) shutil.copyfile(path_from_root('tests', 'sounds', 'alarmcreatemiltaryfoot_1.wav'), os.path.join(self.get_dir(), 'sound2.wav')) From ba50e35b5cfc4e505021528a2699362b2b9d5187 Mon Sep 17 00:00:00 2001 From: Bruce Mitchener Date: Fri, 22 Mar 2013 15:57:03 +0700 Subject: [PATCH 02/38] Don't infinitely recurse in strtof(). --- system/lib/libc/stdlib/strtod.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/lib/libc/stdlib/strtod.c b/system/lib/libc/stdlib/strtod.c index 53191337f259b..7c44124705dbc 100644 --- a/system/lib/libc/stdlib/strtod.c +++ b/system/lib/libc/stdlib/strtod.c @@ -284,7 +284,7 @@ strtold(const char* nptr, char **endptr) float strtof(const char* nptr, char **endptr) { - return (float) strtof(nptr, endptr); + return (float) strtod(nptr, endptr); } // XXX no locale support yet From 3e174a02f853aaffea20ab829f4a08793e60eb2e Mon Sep 17 00:00:00 2001 From: Michael Riss Date: Sat, 2 Mar 2013 22:38:29 +0100 Subject: [PATCH 03/38] select function: return error condition when network connection fails --- src/library.js | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/library.js b/src/library.js index 3ee6f5058798b..efd0720892425 100644 --- a/src/library.js +++ b/src/library.js @@ -7318,7 +7318,12 @@ LibraryManager.library = { if (int & mask) { // index is in the set, check if it is ready for read var info = Sockets.fds[fd]; - if (info && can(info)) { + if (!info) continue; + if ((info.socket.readyState == WebSocket.CLOSING || info.socket.readyState == WebSocket.CLOSED) && info.inQueue.length == 0) { + ___setErrNo(ERRNO_CODES.EBADF); + return -1; + } + if (can(info)) { // set bit fd < 32 ? (dstLow = dstLow | mask) : (dstHigh = dstHigh | mask); bitsSet++; @@ -7331,8 +7336,14 @@ LibraryManager.library = { return bitsSet; } - return checkfds(nfds, readfds, canRead) - + checkfds(nfds, writefds, canWrite); + var readHandles = checkfds(nfds, readfds, canRead); + var writeHandles = checkfds(nfds, writefds, canWrite); + console.log( "readHandles: " + readHandles + ", writeHandles: " + writeHandles ); + if ((readHandles == -1) || (writeHandles == -1)){ + return -1; + } else { + return readHandles + writeHandles; + } }, // pty.h From 0250c45a5b9c955a38436e62ca81041515723bf7 Mon Sep 17 00:00:00 2001 From: Michael Riss Date: Wed, 6 Mar 2013 12:12:53 +0100 Subject: [PATCH 04/38] remove stray console.log --- src/library.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/library.js b/src/library.js index efd0720892425..00c7cfc740f9c 100644 --- a/src/library.js +++ b/src/library.js @@ -7338,7 +7338,6 @@ LibraryManager.library = { var readHandles = checkfds(nfds, readfds, canRead); var writeHandles = checkfds(nfds, writefds, canWrite); - console.log( "readHandles: " + readHandles + ", writeHandles: " + writeHandles ); if ((readHandles == -1) || (writeHandles == -1)){ return -1; } else { From 4790550b897061a8d67368eeb497e671107174a5 Mon Sep 17 00:00:00 2001 From: Michael Riss Date: Sat, 9 Mar 2013 17:51:42 +0100 Subject: [PATCH 05/38] Move error check into canRead function and use an outer scope variable to report the error condition. --- src/library.js | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/library.js b/src/library.js index 00c7cfc740f9c..000b625c4fd2f 100644 --- a/src/library.js +++ b/src/library.js @@ -7288,11 +7288,17 @@ LibraryManager.library = { // exceptfds not supported // timeout is always 0 - fully async assert(!exceptfds); + + var errorCondition = 0; function canRead(info) { // make sure hasData exists. // we do create it when the socket is connected, // but other implementations may create it lazily + if ((info.socket.readyState == WebSocket.CLOSING || info.socket.readyState == WebSocket.CLOSED) && info.inQueue.length == 0) { + errorCondition = -1; + return false; + } return info.hasData && info.hasData(); } @@ -7318,12 +7324,7 @@ LibraryManager.library = { if (int & mask) { // index is in the set, check if it is ready for read var info = Sockets.fds[fd]; - if (!info) continue; - if ((info.socket.readyState == WebSocket.CLOSING || info.socket.readyState == WebSocket.CLOSED) && info.inQueue.length == 0) { - ___setErrNo(ERRNO_CODES.EBADF); - return -1; - } - if (can(info)) { + if (info && can(info)) { // set bit fd < 32 ? (dstLow = dstLow | mask) : (dstHigh = dstHigh | mask); bitsSet++; @@ -7336,12 +7337,12 @@ LibraryManager.library = { return bitsSet; } - var readHandles = checkfds(nfds, readfds, canRead); - var writeHandles = checkfds(nfds, writefds, canWrite); - if ((readHandles == -1) || (writeHandles == -1)){ + var totalHandles = checkfds(nfds, readfds, canRead) + checkfds(nfds, writefds, canWrite); + if (errorCondition) { + ___setErrNo(ERRNO_CODES.EBADF); return -1; } else { - return readHandles + writeHandles; + return totalHandles; } }, From 1fecc4b3072c6a0cfef5c629f50cbaa647ea98b1 Mon Sep 17 00:00:00 2001 From: Michael Riss Date: Fri, 22 Mar 2013 16:58:23 +0100 Subject: [PATCH 06/38] - added test cases for select error reporting - added missing error reporting for sockets in the write file descriptor set --- src/library.js | 4 + tests/runner.py | 65 ++++++ tests/websockets_select.c | 95 ++++++++ ...bsockets_select_server_closes_connection.c | 126 +++++++++++ ...ckets_select_server_closes_connection_rw.c | 213 ++++++++++++++++++ 5 files changed, 503 insertions(+) create mode 100644 tests/websockets_select.c create mode 100644 tests/websockets_select_server_closes_connection.c create mode 100644 tests/websockets_select_server_closes_connection_rw.c diff --git a/src/library.js b/src/library.js index 000b625c4fd2f..66b0ef266383c 100644 --- a/src/library.js +++ b/src/library.js @@ -7306,6 +7306,10 @@ LibraryManager.library = { // make sure socket exists. // we do create it when the socket is connected, // but other implementations may create it lazily + if ((info.socket.readyState == WebSocket.CLOSING || info.socket.readyState == WebSocket.CLOSED)) { + errorCondition = -1; + return false; + } return info.socket && (info.socket.readyState == info.socket.OPEN); } diff --git a/tests/runner.py b/tests/runner.py index db33c81793145..3cf20bc88ce8d 100755 --- a/tests/runner.py +++ b/tests/runner.py @@ -11757,6 +11757,71 @@ def test_websockets_bi_bigdata(self): finally: self.clean_pids() + def test_websockets_select_server_down(self): + def closedServer(q): + import socket + + q.put(None) # No sub-process to start + ssock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + ssock.bind(("127.0.0.1", 8994)) + try: + with self.WebsockHarness(8994, closedServer): + self.btest('websockets_select.c', expected='266') + finally: + self.clean_pids() + + def test_websockets_select_server_closes_connection(self): + def closingServer(q): + import socket + + q.put(None) # No sub-process to start + ssock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + ssock.bind(("127.0.0.1", 8994)) + ssock.listen(2) + while True: + csock, addr = ssock.accept() + print "Connection from %s" % repr(addr) + csock.send("1234567") + csock.close() + + try: + with self.WebsockHarness(8994, closingServer): + self.btest('websockets_select_server_closes_connection.c', expected='266') + finally: + self.clean_pids() + + def test_websockets_select_server_closes_connection_rw(self): + def closingServer_rw(q): + import socket + + q.put(None) # No sub-process to start + ssock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + ssock.bind(("127.0.0.1", 8998)) + ssock.listen(2) + while True: + csock, addr = ssock.accept() + print "Connection from %s" % repr(addr) + readArray = bytearray(10) + #readBuffer = buffer(readArray) + bytesRead = 0 + # Let the client start to write data + while (bytesRead < 10): + (readBytes, address) = csock.recvfrom_into( readArray, 10 ) + bytesRead += readBytes + print "server: 10 bytes read" + # Now we write a message on our own ... + csock.send("0123456789") + print "server: 10 bytes written" + # And immediately close the connection + csock.close() + print "server: connection closed" + + try: + with self.WebsockHarness(8998, closingServer_rw): + self.btest('websockets_select_server_closes_connection_rw.c', expected='266') + finally: + self.clean_pids() + def test_enet(self): try_delete(self.in_dir('enet')) shutil.copytree(path_from_root('tests', 'enet'), self.in_dir('enet')) diff --git a/tests/websockets_select.c b/tests/websockets_select.c new file mode 100644 index 0000000000000..b8ab90914968f --- /dev/null +++ b/tests/websockets_select.c @@ -0,0 +1,95 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#if EMSCRIPTEN +#include +#endif + +#define EXPECTED_BYTES 5 + +int SocketFD; + +int done = 0; + +void iter(void *arg) { + fd_set sett; + FD_ZERO(&sett); + FD_SET(SocketFD, &sett); + + // The error should happen here + int select_says_yes = select(64, &sett, NULL, NULL, NULL); + if( select_says_yes == -1 ){ + printf( "Connection to websocket server failed as expected." ); + perror( "Error message" ); + int result = 266; + REPORT_RESULT(); + done = 1; + } + + assert(!select_says_yes); + done = 1; +} + +// This is for testing a websocket connection to a closed server port. +// The connect call will succeed (due to the asynchronous websocket +// behavior) but once the underlying websocket system realized that +// the connection cannot be established, the next select call will fail. +int main(void) +{ + struct sockaddr_in stSockAddr; + int Res; + SocketFD = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); + + if (-1 == SocketFD) + { + perror("cannot create socket"); + exit(EXIT_FAILURE); + } + + memset(&stSockAddr, 0, sizeof(stSockAddr)); + + stSockAddr.sin_family = AF_INET; + stSockAddr.sin_port = htons( +#if EMSCRIPTEN + 8995 +#else + 8994 +#endif + ); + Res = inet_pton(AF_INET, "127.0.0.1", &stSockAddr.sin_addr); + + if (0 > Res) { + perror("error: first parameter is not a valid address family"); + close(SocketFD); + exit(EXIT_FAILURE); + } else if (0 == Res) { + perror("char string (second parameter does not contain valid ipaddress)"); + close(SocketFD); + exit(EXIT_FAILURE); + } + + // This call should succeed (even if the server port is closed) + if (-1 == connect(SocketFD, (struct sockaddr *)&stSockAddr, sizeof(stSockAddr))) { + perror("connect failed"); + close(SocketFD); + exit(EXIT_FAILURE); + + } + +#if EMSCRIPTEN + emscripten_set_main_loop(iter, 0, 0); +#else + while (!done) iter(NULL); +#endif + + return EXIT_SUCCESS; +} + diff --git a/tests/websockets_select_server_closes_connection.c b/tests/websockets_select_server_closes_connection.c new file mode 100644 index 0000000000000..6ce6d311c5e3c --- /dev/null +++ b/tests/websockets_select_server_closes_connection.c @@ -0,0 +1,126 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#if EMSCRIPTEN +#include +#endif + +#define EXPECTED_BYTES 5 + +int SocketFD; + +int done = 0; + +void iter(void *arg) { + static char readbuf[1024]; + static int readPos = 0; + + fd_set sett; + FD_ZERO(&sett); + FD_SET(SocketFD, &sett); + + if( readPos < 7 ){ + // still reading + int selectRes = select(64, &sett, NULL, NULL, NULL); + + if( selectRes == 0 ) + return; + + if( selectRes == -1 ){ + perror( "Connection to websocket server failed" ); + exit(EXIT_FAILURE); + } + if( selectRes > 0 ){ + assert(FD_ISSET(SocketFD, &sett)); + + int bytesRead = recv( SocketFD, readbuf+readPos, 7-readPos, 0 ); + readPos += bytesRead; + } + } else { + // here the server should have closed the connection + int selectRes = select(64, &sett, NULL, NULL, NULL); + + if( selectRes == 0 ) + return; + + if( selectRes == -1 ){ + perror( "Connection to websocket server failed as expected" ); + int result = 266; + REPORT_RESULT(); + emscripten_cancel_main_loop(); + done = 1; + } + + if( selectRes > 0 ){ + printf( "Error: socket should not show up on select call anymore.\n" ); + exit(EXIT_FAILURE); + } + } + + return; +} + +// Scenario: the server sends data and closes the connection after 7 bytes. +// This test should provoke the situation in which the underlying +// tcp connection has been torn down already but there is still data +// in the inQueue. The select call has to succeed as long the queue +// still contains data and only then start to throw errors. +int main(void) +{ + struct sockaddr_in stSockAddr; + int Res; + SocketFD = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); + + if (-1 == SocketFD) + { + perror("cannot create socket"); + exit(EXIT_FAILURE); + } + + memset(&stSockAddr, 0, sizeof(stSockAddr)); + + stSockAddr.sin_family = AF_INET; + stSockAddr.sin_port = htons( +#if EMSCRIPTEN + 8995 +#else + 8994 +#endif + ); + Res = inet_pton(AF_INET, "127.0.0.1", &stSockAddr.sin_addr); + + if (0 > Res) { + perror("error: first parameter is not a valid address family"); + close(SocketFD); + exit(EXIT_FAILURE); + } else if (0 == Res) { + perror("char string (second parameter does not contain valid ipaddress)"); + close(SocketFD); + exit(EXIT_FAILURE); + } + + // This call should succeed (even if the server port is closed) + if (-1 == connect(SocketFD, (struct sockaddr *)&stSockAddr, sizeof(stSockAddr))) { + perror("connect failed"); + close(SocketFD); + exit(EXIT_FAILURE); + + } + +#if EMSCRIPTEN + emscripten_set_main_loop(iter, 0, 0); +#else + while (!done) iter(NULL); +#endif + + return EXIT_SUCCESS; +} + diff --git a/tests/websockets_select_server_closes_connection_rw.c b/tests/websockets_select_server_closes_connection_rw.c new file mode 100644 index 0000000000000..dd0913bfa1be2 --- /dev/null +++ b/tests/websockets_select_server_closes_connection_rw.c @@ -0,0 +1,213 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#if EMSCRIPTEN +#include +#endif + +#define EXPECTED_BYTES 5 + +int SocketFD; + +int done = 0; + +void iter(void *arg) { + static int state = 0; + static char writebuf[] = "01234567890123456789"; + static int writePos = 0; + static char readbuf[1024]; + static int readPos = 0; + int selectRes; + ssize_t transferAmount; + fd_set sett; + + + switch( state ){ + case 0: + // writing 10 bytes to the server + + // the socket in the read file descriptors has to result in a 0 return value + // because the connection exists, but there is no data yet + FD_ZERO( &sett ); + FD_SET(SocketFD, &sett); + selectRes = select(64, &sett, NULL, NULL, NULL); + if( selectRes != 0 ){ + printf( "case 0: read select != 0\n" ); + exit(EXIT_FAILURE); + } + + // the socket in the write file descriptors has to result in either a 0 or 1 + // the connection either is setting up or is established and writing is possible + FD_ZERO( &sett ); + FD_SET(SocketFD, &sett); + selectRes = select(64, NULL, &sett, NULL, NULL); + if( selectRes == -1 ){ + printf( "case 0: write select == -1\n" ); + exit(EXIT_FAILURE); + } + if( selectRes == 0 ){ + return; + } + + // send a single byte + transferAmount = send( SocketFD, writebuf+writePos, 1, 0 ); + writePos += transferAmount; + + // after 10 bytes switch to next state + if( writePos >= 10 ){ + state = 1; + } + break; + + case 1: + // wait until we can read one byte to make sure the server + // has sent the data and then closed the connection + FD_ZERO( &sett ); + FD_SET(SocketFD, &sett); + selectRes = select(64, &sett, NULL, NULL, NULL); + if( selectRes == -1 ){ + printf( "case 1: read selectRes == -1\n" ); + exit(EXIT_FAILURE); + } + if( selectRes == 0 ) + return; + + // read a single byte + transferAmount = recv( SocketFD, readbuf+readPos, 1, 0 ); + readPos += transferAmount; + + // if successfully reading 1 byte, switch to next state + if( readPos >= 1 ){ + state = 2; + } + break; + + case 2: + // calling select with the socket in the write file descriptors has + // to fail because the tcp network connection is already down + FD_ZERO( &sett ); + FD_SET(SocketFD, &sett); + selectRes = select(64, NULL, &sett, NULL, NULL); + if( selectRes != -1 ){ + printf( "case 2: write selectRes != -1\n" ); + exit(EXIT_FAILURE); + } + + // calling select with the socket in the read file descriptors + // has to succeed because there is still data in the inQueue + FD_ZERO( &sett ); + FD_SET(SocketFD, &sett); + selectRes = select(64, &sett, NULL, NULL, NULL); + if( selectRes != 1 ){ + printf( "case 2: read selectRes != 1\n" ); + exit(EXIT_FAILURE); + } + if( selectRes == 0 ) + return; + + // read a single byte + transferAmount = recv( SocketFD, readbuf+readPos, 1, 0 ); + readPos += transferAmount; + + // with 10 bytes read the inQueue is empty => switch state + if( readPos >= 10 ){ + state = 3; + } + break; + + case 3: + // calling select with the socket in the read file descriptors + // now also has to fail as the inQueue is empty + FD_ZERO( &sett ); + FD_SET(SocketFD, &sett); + selectRes = select(64, &sett, NULL, NULL, NULL); + if( selectRes != -1 ){ + printf( "case 3: read selectRes != -1\n" ); + exit(EXIT_FAILURE); + } + + // report back success, the 266 is just an arbitrary value without + // deeper meaning + int result = 266; + REPORT_RESULT(); + break; + + default: + printf( "Impossible state!\n" ); + exit(EXIT_FAILURE); + break; + } + + return; +} + +// This test checks for an intended asymmetry in the behavior of the select function. +// Scenario: the client sends data to the server. After 10 received bytes the +// server sends 10 bytes on its own and immediately afterwards closes the connection. +// This mimics a typical connect-request-response-disconnect situation. +// After the server closed the connection select calls with the socket in the write file +// descriptors have to fail as the tcp connection is already down and there is no way +// anymore to send data. +// Select calls with the socket in the read file descriptor list still have to succeed +// as there are still 10 bytes to read from the inQueue. So, for the same socket the +// select call behaves differently depending on whether the socket is listed in the +// read or write file descriptors. +int main(void) +{ + struct sockaddr_in stSockAddr; + int Res; + SocketFD = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); + + if (-1 == SocketFD) + { + perror("cannot create socket"); + exit(EXIT_FAILURE); + } + + memset(&stSockAddr, 0, sizeof(stSockAddr)); + + stSockAddr.sin_family = AF_INET; + stSockAddr.sin_port = htons( +#if EMSCRIPTEN + 8999 +#else + 8998 +#endif + ); + Res = inet_pton(AF_INET, "127.0.0.1", &stSockAddr.sin_addr); + + if (0 > Res) { + perror("error: first parameter is not a valid address family"); + close(SocketFD); + exit(EXIT_FAILURE); + } else if (0 == Res) { + perror("char string (second parameter does not contain valid ipaddress)"); + close(SocketFD); + exit(EXIT_FAILURE); + } + + // This call should succeed (even if the server port is closed) + if (-1 == connect(SocketFD, (struct sockaddr *)&stSockAddr, sizeof(stSockAddr))) { + perror("connect failed"); + close(SocketFD); + exit(EXIT_FAILURE); + + } + +#if EMSCRIPTEN + emscripten_set_main_loop(iter, 0, 0); +#else + while (!done) iter(NULL); +#endif + + return EXIT_SUCCESS; +} + From bc2c6ba21551f54c42047b01beeccf9daae7a03a Mon Sep 17 00:00:00 2001 From: Bruce Mitchener Date: Sat, 23 Mar 2013 12:42:20 +0700 Subject: [PATCH 07/38] Re-instate _ATTRIBUTE() usages. These were broken because the definition of _ATTRIBUTE() from libcxx was different, so change the libc definition and usage to match. Fixes issue #992. --- system/include/libc/_ansi.h | 4 +- system/include/libc/assert.h | 8 +- system/include/libc/stdio.h | 320 +++++++++++++++---------------- system/include/libc/stdlib.h | 10 +- system/include/libc/sys/unistd.h | 2 +- 5 files changed, 172 insertions(+), 172 deletions(-) diff --git a/system/include/libc/_ansi.h b/system/include/libc/_ansi.h index 8548e0fe72166..c38e22e8f86db 100644 --- a/system/include/libc/_ansi.h +++ b/system/include/libc/_ansi.h @@ -105,9 +105,9 @@ #ifndef _ATTRIBUTE /* XXX Emscripten */ #ifdef __GNUC__ -#define _ATTRIBUTE(attrs) __attribute__ (attrs) +#define _ATTRIBUTE(attr) __attribute__ ((attr)) #else -#define _ATTRIBUTE(attrs) +#define _ATTRIBUTE(attr) #endif #endif /* XXX Emscripten */ diff --git a/system/include/libc/assert.h b/system/include/libc/assert.h index 6035227f7dede..8d11283934496 100644 --- a/system/include/libc/assert.h +++ b/system/include/libc/assert.h @@ -36,10 +36,10 @@ extern "C" { # endif /* !__ASSERT_FUNC */ #endif /* !NDEBUG */ -void _EXFUN(__assert, (const char *, int, const char *)); -/* _ATTRIBUTE ((__noreturn__))); */ -void _EXFUN(__assert_func, (const char *, int, const char *, const char *)); -/* _ATTRIBUTE ((__noreturn__))); */ +void _EXFUN(__assert, (const char *, int, const char *) + _ATTRIBUTE(noreturn)); +void _EXFUN(__assert_func, (const char *, int, const char *, const char *) + _ATTRIBUTE(noreturn)); #ifdef __cplusplus } diff --git a/system/include/libc/stdio.h b/system/include/libc/stdio.h index 4e14df79835af..19e1103968f6b 100644 --- a/system/include/libc/stdio.h +++ b/system/include/libc/stdio.h @@ -184,22 +184,22 @@ int _EXFUN(fflush, (FILE *)); FILE * _EXFUN(freopen, (const char *, const char *, FILE *)); void _EXFUN(setbuf, (FILE *, char *)); int _EXFUN(setvbuf, (FILE *, char *, int, size_t)); -int _EXFUN(fprintf, (FILE *, const char *, ...)); -/* XXX Emscripten_ATTRIBUTE ((__format__ (__printf__, 2, 3)))); */ -int _EXFUN(fscanf, (FILE *, const char *, ...)); -/* _ATTRIBUTE ((__format__ (__scanf__, 2, 3)))); */ -int _EXFUN(printf, (const char *, ...)); -/* _ATTRIBUTE ((__format__ (__printf__, 1, 2)))); */ -int _EXFUN(scanf, (const char *, ...)); -/* _ATTRIBUTE ((__format__ (__scanf__, 1, 2)))); */ -int _EXFUN(sscanf, (const char *, const char *, ...)); -/* _ATTRIBUTE ((__format__ (__scanf__, 2, 3)))); */ -int _EXFUN(vfprintf, (FILE *, const char *, __VALIST)); -/* _ATTRIBUTE ((__format__ (__printf__, 2, 0)))); */ -int _EXFUN(vprintf, (const char *, __VALIST)); -/* _ATTRIBUTE ((__format__ (__printf__, 1, 0)))); */ -int _EXFUN(vsprintf, (char *, const char *, __VALIST)); -/* _ATTRIBUTE ((__format__ (__printf__, 2, 0)))); */ +int _EXFUN(fprintf, (FILE *, const char *, ...) + _ATTRIBUTE (__format__ (__printf__, 2, 3))); +int _EXFUN(fscanf, (FILE *, const char *, ...) + _ATTRIBUTE (__format__ (__scanf__, 2, 3))); +int _EXFUN(printf, (const char *, ...) + _ATTRIBUTE (__format__ (__printf__, 1, 2))); +int _EXFUN(scanf, (const char *, ...) + _ATTRIBUTE (__format__ (__scanf__, 1, 2))); +int _EXFUN(sscanf, (const char *, const char *, ...) + _ATTRIBUTE (__format__ (__scanf__, 2, 3))); +int _EXFUN(vfprintf, (FILE *, const char *, __VALIST) + _ATTRIBUTE (__format__ (__printf__, 2, 0))); +int _EXFUN(vprintf, (const char *, __VALIST) + _ATTRIBUTE (__format__ (__printf__, 1, 0))); +int _EXFUN(vsprintf, (char *, const char *, __VALIST) + _ATTRIBUTE (__format__ (__printf__, 2, 0))); int _EXFUN(fgetc, (FILE *)); char * _EXFUN(fgets, (char *, int, FILE *)); int _EXFUN(fputc, (int, FILE *)); @@ -232,8 +232,8 @@ int _EXFUN(ferror, (FILE *)); void _EXFUN(perror, (const char *)); #ifndef _REENT_ONLY FILE * _EXFUN(fopen, (const char *_name, const char *_type)); -int _EXFUN(sprintf, (char *, const char *, ...)); -/* XXX EMSCRIPTEN _ATTRIBUTE ((__format__ (__printf__, 2, 3)))); */ +int _EXFUN(sprintf, (char *, const char *, ...) + _ATTRIBUTE (__format__ (__printf__, 2, 3))); int _EXFUN(remove, (const char *)); int _EXFUN(rename, (const char *, const char *)); #endif @@ -248,68 +248,68 @@ off_t _EXFUN(ftello, ( FILE *)); #endif #if !defined(__STRICT_ANSI__) || (__STDC_VERSION__ >= 199901L) #ifndef _REENT_ONLY -int _EXFUN(asiprintf, (char **, const char *, ...)); -/* XXX EMSCRIPTEN _ATTRIBUTE ((__format__ (__printf__, 2, 3)))); */ -char * _EXFUN(asniprintf, (char *, size_t *, const char *, ...)); -/* _ATTRIBUTE ((__format__ (__printf__, 3, 4)))); */ -char * _EXFUN(asnprintf, (char *, size_t *, const char *, ...)); -/* _ATTRIBUTE ((__format__ (__printf__, 3, 4)))); */ -int _EXFUN(asprintf, (char **, const char *, ...)); -/* _ATTRIBUTE ((__format__ (__printf__, 2, 3)))); */ +int _EXFUN(asiprintf, (char **, const char *, ...) + _ATTRIBUTE (__format__ (__printf__, 2, 3))); +char * _EXFUN(asniprintf, (char *, size_t *, const char *, ...) + _ATTRIBUTE (__format__ (__printf__, 3, 4))); +char * _EXFUN(asnprintf, (char *, size_t *, const char *, ...) + _ATTRIBUTE (__format__ (__printf__, 3, 4))); +int _EXFUN(asprintf, (char **, const char *, ...) + _ATTRIBUTE (__format__ (__printf__, 2, 3))); #ifndef diprintf -int _EXFUN(diprintf, (int, const char *, ...)); -/* _ATTRIBUTE ((__format__ (__printf__, 2, 3)))); */ +int _EXFUN(diprintf, (int, const char *, ...) + _ATTRIBUTE (__format__ (__printf__, 2, 3))); #endif int _EXFUN(fcloseall, (_VOID)); -int _EXFUN(fiprintf, (FILE *, const char *, ...)); -/* _ATTRIBUTE ((__format__ (__printf__, 2, 3)))); */ -int _EXFUN(fiscanf, (FILE *, const char *, ...)); -/* _ATTRIBUTE ((__format__ (__scanf__, 2, 3)))); */ -int _EXFUN(iprintf, (const char *, ...)); -/* _ATTRIBUTE ((__format__ (__printf__, 1, 2)))); */ -int _EXFUN(iscanf, (const char *, ...)); -/* _ATTRIBUTE ((__format__ (__scanf__, 1, 2)))); */ -int _EXFUN(siprintf, (char *, const char *, ...)); -/* _ATTRIBUTE ((__format__ (__printf__, 2, 3)))); */ -int _EXFUN(siscanf, (const char *, const char *, ...)); -/* _ATTRIBUTE ((__format__ (__scanf__, 2, 3)))); */ -int _EXFUN(snprintf, (char *, size_t, const char *, ...)); -/* _ATTRIBUTE ((__format__ (__printf__, 3, 4)))); */ -int _EXFUN(sniprintf, (char *, size_t, const char *, ...)); -/* _ATTRIBUTE ((__format__ (__printf__, 3, 4)))); */ +int _EXFUN(fiprintf, (FILE *, const char *, ...) + _ATTRIBUTE (__format__ (__printf__, 2, 3))); +int _EXFUN(fiscanf, (FILE *, const char *, ...) + _ATTRIBUTE (__format__ (__scanf__, 2, 3))); +int _EXFUN(iprintf, (const char *, ...) + _ATTRIBUTE (__format__ (__printf__, 1, 2))); +int _EXFUN(iscanf, (const char *, ...) + _ATTRIBUTE (__format__ (__scanf__, 1, 2))); +int _EXFUN(siprintf, (char *, const char *, ...) + _ATTRIBUTE (__format__ (__printf__, 2, 3))); +int _EXFUN(siscanf, (const char *, const char *, ...) + _ATTRIBUTE (__format__ (__scanf__, 2, 3))); +int _EXFUN(snprintf, (char *, size_t, const char *, ...) + _ATTRIBUTE (__format__ (__printf__, 3, 4))); +int _EXFUN(sniprintf, (char *, size_t, const char *, ...) + _ATTRIBUTE (__format__ (__printf__, 3, 4))); char * _EXFUN(tempnam, (const char *, const char *)); -int _EXFUN(vasiprintf, (char **, const char *, __VALIST)); -/* _ATTRIBUTE ((__format__ (__printf__, 2, 0)))); */ -char * _EXFUN(vasniprintf, (char *, size_t *, const char *, __VALIST)); -/* _ATTRIBUTE ((__format__ (__printf__, 3, 0)))); */ -char * _EXFUN(vasnprintf, (char *, size_t *, const char *, __VALIST)); -/* _ATTRIBUTE ((__format__ (__printf__, 3, 0)))); */ -int _EXFUN(vasprintf, (char **, const char *, __VALIST)); -/* _ATTRIBUTE ((__format__ (__printf__, 2, 0)))); */ -int _EXFUN(vdiprintf, (int, const char *, __VALIST)); -/* _ATTRIBUTE ((__format__ (__printf__, 2, 0)))); */ -int _EXFUN(vfiprintf, (FILE *, const char *, __VALIST)); -/* _ATTRIBUTE ((__format__ (__printf__, 2, 0)))); */ -int _EXFUN(vfiscanf, (FILE *, const char *, __VALIST)); -/* _ATTRIBUTE ((__format__ (__scanf__, 2, 0)))); */ -int _EXFUN(vfscanf, (FILE *, const char *, __VALIST)); -/* _ATTRIBUTE ((__format__ (__scanf__, 2, 0)))); */ -int _EXFUN(viprintf, (const char *, __VALIST)); -/* _ATTRIBUTE ((__format__ (__printf__, 1, 0)))); */ -int _EXFUN(viscanf, (const char *, __VALIST)); -/* _ATTRIBUTE ((__format__ (__scanf__, 1, 0)))); */ -int _EXFUN(vscanf, (const char *, __VALIST)); -/* _ATTRIBUTE ((__format__ (__scanf__, 1, 0)))); */ -int _EXFUN(vsiprintf, (char *, const char *, __VALIST)); -/* _ATTRIBUTE ((__format__ (__printf__, 2, 0)))); */ -int _EXFUN(vsiscanf, (const char *, const char *, __VALIST)); -/* _ATTRIBUTE ((__format__ (__scanf__, 2, 0)))); */ -int _EXFUN(vsniprintf, (char *, size_t, const char *, __VALIST)); -/* _ATTRIBUTE ((__format__ (__printf__, 3, 0)))); */ -int _EXFUN(vsnprintf, (char *, size_t, const char *, __VALIST)); -/* _ATTRIBUTE ((__format__ (__printf__, 3, 0)))); */ -int _EXFUN(vsscanf, (const char *, const char *, __VALIST)); -/* _ATTRIBUTE ((__format__ (__scanf__, 2, 0)))); */ +int _EXFUN(vasiprintf, (char **, const char *, __VALIST) + _ATTRIBUTE (__format__ (__printf__, 2, 0))); +char * _EXFUN(vasniprintf, (char *, size_t *, const char *, __VALIST) + _ATTRIBUTE (__format__ (__printf__, 3, 0))); +char * _EXFUN(vasnprintf, (char *, size_t *, const char *, __VALIST) + _ATTRIBUTE (__format__ (__printf__, 3, 0))); +int _EXFUN(vasprintf, (char **, const char *, __VALIST) + _ATTRIBUTE (__format__ (__printf__, 2, 0))); +int _EXFUN(vdiprintf, (int, const char *, __VALIST) + _ATTRIBUTE (__format__ (__printf__, 2, 0))); +int _EXFUN(vfiprintf, (FILE *, const char *, __VALIST) + _ATTRIBUTE (__format__ (__printf__, 2, 0))); +int _EXFUN(vfiscanf, (FILE *, const char *, __VALIST) + _ATTRIBUTE (__format__ (__scanf__, 2, 0))); +int _EXFUN(vfscanf, (FILE *, const char *, __VALIST) + _ATTRIBUTE (__format__ (__scanf__, 2, 0))); +int _EXFUN(viprintf, (const char *, __VALIST) + _ATTRIBUTE (__format__ (__printf__, 1, 0))); +int _EXFUN(viscanf, (const char *, __VALIST) + _ATTRIBUTE (__format__ (__scanf__, 1, 0))); +int _EXFUN(vscanf, (const char *, __VALIST) + _ATTRIBUTE (__format__ (__scanf__, 1, 0))); +int _EXFUN(vsiprintf, (char *, const char *, __VALIST) + _ATTRIBUTE (__format__ (__printf__, 2, 0))); +int _EXFUN(vsiscanf, (const char *, const char *, __VALIST) + _ATTRIBUTE (__format__ (__scanf__, 2, 0))); +int _EXFUN(vsniprintf, (char *, size_t, const char *, __VALIST) + _ATTRIBUTE (__format__ (__printf__, 3, 0))); +int _EXFUN(vsnprintf, (char *, size_t, const char *, __VALIST) + _ATTRIBUTE (__format__ (__printf__, 3, 0))); +int _EXFUN(vsscanf, (const char *, const char *, __VALIST) + _ATTRIBUTE (__format__ (__scanf__, 2, 0))); #endif /* !_REENT_ONLY */ #endif /* !__STRICT_ANSI__ */ @@ -344,8 +344,8 @@ int _EXFUN(putchar_unlocked, (int)); #ifndef __STRICT_ANSI__ # ifndef _REENT_ONLY # ifndef dprintf -int _EXFUN(dprintf, (int, const char *, ...)); -/* _ATTRIBUTE ((__format__ (__printf__, 2, 3)))); */ +int _EXFUN(dprintf, (int, const char *, ...) + _ATTRIBUTE (__format__ (__printf__, 2, 3))); # endif FILE * _EXFUN(fmemopen, (void *, size_t, const char *)); /* getdelim - see __getdelim for now */ @@ -354,8 +354,8 @@ FILE * _EXFUN(open_memstream, (char **, size_t *)); #if defined (__CYGWIN__) int _EXFUN(renameat, (int, const char *, int, const char *)); #endif -int _EXFUN(vdprintf, (int, const char *, __VALIST)); -/* _ATTRIBUTE ((__format__ (__printf__, 2, 0)))); */ +int _EXFUN(vdprintf, (int, const char *, __VALIST) + _ATTRIBUTE (__format__ (__printf__, 2, 0))); # endif #endif @@ -363,18 +363,18 @@ int _EXFUN(vdprintf, (int, const char *, __VALIST)); * Recursive versions of the above. */ -int _EXFUN(_asiprintf_r, (struct _reent *, char **, const char *, ...)); -/* _ATTRIBUTE ((__format__ (__printf__, 3, 4)))); */ -char * _EXFUN(_asniprintf_r, (struct _reent *, char *, size_t *, const char *, ...)); -/* _ATTRIBUTE ((__format__ (__printf__, 4, 5)))); */ -char * _EXFUN(_asnprintf_r, (struct _reent *, char *, size_t *, const char *, ...)); -/* _ATTRIBUTE ((__format__ (__printf__, 4, 5)))); */ -int _EXFUN(_asprintf_r, (struct _reent *, char **, const char *, ...)); -/* _ATTRIBUTE ((__format__ (__printf__, 3, 4)))); */ -int _EXFUN(_diprintf_r, (struct _reent *, int, const char *, ...)); -/* _ATTRIBUTE ((__format__ (__printf__, 3, 4)))); */ -int _EXFUN(_dprintf_r, (struct _reent *, int, const char *, ...)); -/* _ATTRIBUTE ((__format__ (__printf__, 3, 4)))); */ +int _EXFUN(_asiprintf_r, (struct _reent *, char **, const char *, ...) + _ATTRIBUTE (__format__ (__printf__, 3, 4))); +char * _EXFUN(_asniprintf_r, (struct _reent *, char *, size_t *, const char *, ...) + _ATTRIBUTE (__format__ (__printf__, 4, 5))); +char * _EXFUN(_asnprintf_r, (struct _reent *, char *, size_t *, const char *, ...) + _ATTRIBUTE (__format__ (__printf__, 4, 5))); +int _EXFUN(_asprintf_r, (struct _reent *, char **, const char *, ...) + _ATTRIBUTE (__format__ (__printf__, 3, 4))); +int _EXFUN(_diprintf_r, (struct _reent *, int, const char *, ...) + _ATTRIBUTE (__format__ (__printf__, 3, 4))); +int _EXFUN(_dprintf_r, (struct _reent *, int, const char *, ...) + _ATTRIBUTE (__format__ (__printf__, 3, 4))); int _EXFUN(_fclose_r, (struct _reent *, FILE *)); int _EXFUN(_fcloseall_r, (struct _reent *)); FILE * _EXFUN(_fdopen_r, (struct _reent *, int, const char *)); @@ -388,21 +388,21 @@ int _EXFUN(_fsetpos_r, (struct _reent *, FILE *, const _fpos_t *)); int _EXFUN(_fgetpos_r, (struct _reent *, FILE *, fpos_t *)); int _EXFUN(_fsetpos_r, (struct _reent *, FILE *, const fpos_t *)); #endif -int _EXFUN(_fiprintf_r, (struct _reent *, FILE *, const char *, ...)); -/* _ATTRIBUTE ((__format__ (__printf__, 3, 4)))); */ -int _EXFUN(_fiscanf_r, (struct _reent *, FILE *, const char *, ...)); -/* _ATTRIBUTE ((__format__ (__scanf__, 3, 4)))); */ +int _EXFUN(_fiprintf_r, (struct _reent *, FILE *, const char *, ...) + _ATTRIBUTE (__format__ (__printf__, 3, 4))); +int _EXFUN(_fiscanf_r, (struct _reent *, FILE *, const char *, ...) + _ATTRIBUTE (__format__ (__scanf__, 3, 4))); FILE * _EXFUN(_fmemopen_r, (struct _reent *, void *, size_t, const char *)); FILE * _EXFUN(_fopen_r, (struct _reent *, const char *, const char *)); FILE * _EXFUN(_freopen_r, (struct _reent *, const char *, const char *, FILE *)); -int _EXFUN(_fprintf_r, (struct _reent *, FILE *, const char *, ...)); -/* _ATTRIBUTE ((__format__ (__printf__, 3, 4)))); */ +int _EXFUN(_fprintf_r, (struct _reent *, FILE *, const char *, ...) + _ATTRIBUTE (__format__ (__printf__, 3, 4))); int _EXFUN(_fpurge_r, (struct _reent *, FILE *)); int _EXFUN(_fputc_r, (struct _reent *, int, FILE *)); int _EXFUN(_fputs_r, (struct _reent *, const char *, FILE *)); size_t _EXFUN(_fread_r, (struct _reent *, _PTR, size_t _size, size_t _n, FILE *)); -int _EXFUN(_fscanf_r, (struct _reent *, FILE *, const char *, ...)); -/* _ATTRIBUTE ((__format__ (__scanf__, 3, 4)))); */ +int _EXFUN(_fscanf_r, (struct _reent *, FILE *, const char *, ...) + _ATTRIBUTE (__format__ (__scanf__, 3, 4))); int _EXFUN(_fseek_r, (struct _reent *, FILE *, long, int)); int _EXFUN(_fseeko_r,(struct _reent *, FILE *, _off_t, int)); long _EXFUN(_ftell_r, (struct _reent *, FILE *)); @@ -414,14 +414,14 @@ int _EXFUN(_getc_unlocked_r, (struct _reent *, FILE *)); int _EXFUN(_getchar_r, (struct _reent *)); int _EXFUN(_getchar_unlocked_r, (struct _reent *)); char * _EXFUN(_gets_r, (struct _reent *, char *)); -int _EXFUN(_iprintf_r, (struct _reent *, const char *, ...)); -/* _ATTRIBUTE ((__format__ (__printf__, 2, 3)))); */ -int _EXFUN(_iscanf_r, (struct _reent *, const char *, ...)); -/* _ATTRIBUTE ((__format__ (__scanf__, 2, 3)))); */ +int _EXFUN(_iprintf_r, (struct _reent *, const char *, ...) + _ATTRIBUTE (__format__ (__printf__, 2, 3))); +int _EXFUN(_iscanf_r, (struct _reent *, const char *, ...) + _ATTRIBUTE (__format__ (__scanf__, 2, 3))); FILE * _EXFUN(_open_memstream_r, (struct _reent *, char **, size_t *)); void _EXFUN(_perror_r, (struct _reent *, const char *)); -int _EXFUN(_printf_r, (struct _reent *, const char *, ...)); -/* _ATTRIBUTE ((__format__ (__printf__, 2, 3)))); */ +int _EXFUN(_printf_r, (struct _reent *, const char *, ...) + _ATTRIBUTE (__format__ (__printf__, 2, 3))); int _EXFUN(_putc_r, (struct _reent *, int, FILE *)); int _EXFUN(_putc_unlocked_r, (struct _reent *, int, FILE *)); int _EXFUN(_putchar_unlocked_r, (struct _reent *, int)); @@ -430,64 +430,64 @@ int _EXFUN(_puts_r, (struct _reent *, const char *)); int _EXFUN(_remove_r, (struct _reent *, const char *)); int _EXFUN(_rename_r, (struct _reent *, const char *_old, const char *_new)); -int _EXFUN(_scanf_r, (struct _reent *, const char *, ...)); -/* _ATTRIBUTE ((__format__ (__scanf__, 2, 3)))); */ -int _EXFUN(_siprintf_r, (struct _reent *, char *, const char *, ...)); -/* _ATTRIBUTE ((__format__ (__printf__, 3, 4)))); */ -int _EXFUN(_siscanf_r, (struct _reent *, const char *, const char *, ...)); -/* _ATTRIBUTE ((__format__ (__scanf__, 3, 4)))); */ -int _EXFUN(_sniprintf_r, (struct _reent *, char *, size_t, const char *, ...)); -/* _ATTRIBUTE ((__format__ (__printf__, 4, 5)))); */ -int _EXFUN(_snprintf_r, (struct _reent *, char *, size_t, const char *, ...)); -/* _ATTRIBUTE ((__format__ (__printf__, 4, 5)))); */ -int _EXFUN(_sprintf_r, (struct _reent *, char *, const char *, ...)); -/* _ATTRIBUTE ((__format__ (__printf__, 3, 4)))); */ -int _EXFUN(_sscanf_r, (struct _reent *, const char *, const char *, ...)); -/* _ATTRIBUTE ((__format__ (__scanf__, 3, 4)))); */ +int _EXFUN(_scanf_r, (struct _reent *, const char *, ...) + _ATTRIBUTE (__format__ (__scanf__, 2, 3))); +int _EXFUN(_siprintf_r, (struct _reent *, char *, const char *, ...) + _ATTRIBUTE (__format__ (__printf__, 3, 4))); +int _EXFUN(_siscanf_r, (struct _reent *, const char *, const char *, ...) + _ATTRIBUTE (__format__ (__scanf__, 3, 4))); +int _EXFUN(_sniprintf_r, (struct _reent *, char *, size_t, const char *, ...) + _ATTRIBUTE (__format__ (__printf__, 4, 5))); +int _EXFUN(_snprintf_r, (struct _reent *, char *, size_t, const char *, ...) + _ATTRIBUTE (__format__ (__printf__, 4, 5))); +int _EXFUN(_sprintf_r, (struct _reent *, char *, const char *, ...) + _ATTRIBUTE (__format__ (__printf__, 3, 4))); +int _EXFUN(_sscanf_r, (struct _reent *, const char *, const char *, ...) + _ATTRIBUTE (__format__ (__scanf__, 3, 4))); char * _EXFUN(_tempnam_r, (struct _reent *, const char *, const char *)); FILE * _EXFUN(_tmpfile_r, (struct _reent *)); char * _EXFUN(_tmpnam_r, (struct _reent *, char *)); int _EXFUN(_ungetc_r, (struct _reent *, int, FILE *)); -int _EXFUN(_vasiprintf_r, (struct _reent *, char **, const char *, __VALIST)); -/* _ATTRIBUTE ((__format__ (__printf__, 3, 0)))); */ -char * _EXFUN(_vasniprintf_r, (struct _reent*, char *, size_t *, const char *, __VALIST)); -/* _ATTRIBUTE ((__format__ (__printf__, 4, 0)))); */ -char * _EXFUN(_vasnprintf_r, (struct _reent*, char *, size_t *, const char *, __VALIST)); -/* _ATTRIBUTE ((__format__ (__printf__, 4, 0)))); */ -int _EXFUN(_vasprintf_r, (struct _reent *, char **, const char *, __VALIST)); -/* _ATTRIBUTE ((__format__ (__printf__, 3, 0)))); */ -int _EXFUN(_vdiprintf_r, (struct _reent *, int, const char *, __VALIST)); -/* _ATTRIBUTE ((__format__ (__printf__, 3, 0)))); */ -int _EXFUN(_vdprintf_r, (struct _reent *, int, const char *, __VALIST)); -/* _ATTRIBUTE ((__format__ (__printf__, 3, 0)))); */ -int _EXFUN(_vfiprintf_r, (struct _reent *, FILE *, const char *, __VALIST)); -/* _ATTRIBUTE ((__format__ (__printf__, 3, 0)))); */ -int _EXFUN(_vfiscanf_r, (struct _reent *, FILE *, const char *, __VALIST)); -/* _ATTRIBUTE ((__format__ (__scanf__, 3, 0)))); */ -int _EXFUN(_vfprintf_r, (struct _reent *, FILE *, const char *, __VALIST)); -/* _ATTRIBUTE ((__format__ (__printf__, 3, 0)))); */ -int _EXFUN(_vfscanf_r, (struct _reent *, FILE *, const char *, __VALIST)); -/* _ATTRIBUTE ((__format__ (__scanf__, 3, 0)))); */ -int _EXFUN(_viprintf_r, (struct _reent *, const char *, __VALIST)); -/* _ATTRIBUTE ((__format__ (__printf__, 2, 0)))); */ -int _EXFUN(_viscanf_r, (struct _reent *, const char *, __VALIST)); -/* _ATTRIBUTE ((__format__ (__scanf__, 2, 0)))); */ -int _EXFUN(_vprintf_r, (struct _reent *, const char *, __VALIST)); -/* _ATTRIBUTE ((__format__ (__printf__, 2, 0)))); */ -int _EXFUN(_vscanf_r, (struct _reent *, const char *, __VALIST)); -/* _ATTRIBUTE ((__format__ (__scanf__, 2, 0)))); */ -int _EXFUN(_vsiprintf_r, (struct _reent *, char *, const char *, __VALIST)); -/* _ATTRIBUTE ((__format__ (__printf__, 3, 0)))); */ -int _EXFUN(_vsiscanf_r, (struct _reent *, const char *, const char *, __VALIST)); -/* _ATTRIBUTE ((__format__ (__scanf__, 3, 0)))); */ -int _EXFUN(_vsniprintf_r, (struct _reent *, char *, size_t, const char *, __VALIST)); -/* _ATTRIBUTE ((__format__ (__printf__, 4, 0)))); */ -int _EXFUN(_vsnprintf_r, (struct _reent *, char *, size_t, const char *, __VALIST)); -/* _ATTRIBUTE ((__format__ (__printf__, 4, 0)))); */ -int _EXFUN(_vsprintf_r, (struct _reent *, char *, const char *, __VALIST)); -/* _ATTRIBUTE ((__format__ (__printf__, 3, 0)))); */ -int _EXFUN(_vsscanf_r, (struct _reent *, const char *, const char *, __VALIST)); -/* _ATTRIBUTE ((__format__ (__scanf__, 3, 0)))); */ +int _EXFUN(_vasiprintf_r, (struct _reent *, char **, const char *, __VALIST) + _ATTRIBUTE (__format__ (__printf__, 3, 0))); +char * _EXFUN(_vasniprintf_r, (struct _reent*, char *, size_t *, const char *, __VALIST) + _ATTRIBUTE (__format__ (__printf__, 4, 0))); +char * _EXFUN(_vasnprintf_r, (struct _reent*, char *, size_t *, const char *, __VALIST) + _ATTRIBUTE (__format__ (__printf__, 4, 0))); +int _EXFUN(_vasprintf_r, (struct _reent *, char **, const char *, __VALIST) + _ATTRIBUTE (__format__ (__printf__, 3, 0))); +int _EXFUN(_vdiprintf_r, (struct _reent *, int, const char *, __VALIST) + _ATTRIBUTE (__format__ (__printf__, 3, 0))); +int _EXFUN(_vdprintf_r, (struct _reent *, int, const char *, __VALIST) + _ATTRIBUTE (__format__ (__printf__, 3, 0))); +int _EXFUN(_vfiprintf_r, (struct _reent *, FILE *, const char *, __VALIST) + _ATTRIBUTE (__format__ (__printf__, 3, 0))); +int _EXFUN(_vfiscanf_r, (struct _reent *, FILE *, const char *, __VALIST) + _ATTRIBUTE (__format__ (__scanf__, 3, 0))); +int _EXFUN(_vfprintf_r, (struct _reent *, FILE *, const char *, __VALIST) + _ATTRIBUTE (__format__ (__printf__, 3, 0))); +int _EXFUN(_vfscanf_r, (struct _reent *, FILE *, const char *, __VALIST) + _ATTRIBUTE (__format__ (__scanf__, 3, 0))); +int _EXFUN(_viprintf_r, (struct _reent *, const char *, __VALIST) + _ATTRIBUTE (__format__ (__printf__, 2, 0))); +int _EXFUN(_viscanf_r, (struct _reent *, const char *, __VALIST) + _ATTRIBUTE (__format__ (__scanf__, 2, 0))); +int _EXFUN(_vprintf_r, (struct _reent *, const char *, __VALIST) + _ATTRIBUTE (__format__ (__printf__, 2, 0))); +int _EXFUN(_vscanf_r, (struct _reent *, const char *, __VALIST) + _ATTRIBUTE (__format__ (__scanf__, 2, 0))); +int _EXFUN(_vsiprintf_r, (struct _reent *, char *, const char *, __VALIST) + _ATTRIBUTE (__format__ (__printf__, 3, 0))); +int _EXFUN(_vsiscanf_r, (struct _reent *, const char *, const char *, __VALIST) + _ATTRIBUTE (__format__ (__scanf__, 3, 0))); +int _EXFUN(_vsniprintf_r, (struct _reent *, char *, size_t, const char *, __VALIST) + _ATTRIBUTE (__format__ (__printf__, 4, 0))); +int _EXFUN(_vsnprintf_r, (struct _reent *, char *, size_t, const char *, __VALIST) + _ATTRIBUTE (__format__ (__printf__, 4, 0))); +int _EXFUN(_vsprintf_r, (struct _reent *, char *, const char *, __VALIST) + _ATTRIBUTE (__format__ (__printf__, 3, 0))); +int _EXFUN(_vsscanf_r, (struct _reent *, const char *, const char *, __VALIST) + _ATTRIBUTE (__format__ (__scanf__, 3, 0))); /* Other extensions. */ diff --git a/system/include/libc/stdlib.h b/system/include/libc/stdlib.h index d8cf911b6da0d..888b60411d483 100644 --- a/system/include/libc/stdlib.h +++ b/system/include/libc/stdlib.h @@ -59,7 +59,7 @@ int _EXFUN(__locale_mb_cur_max,(_VOID)); #define MB_CUR_MAX __locale_mb_cur_max() -_VOID _EXFUN(abort,(_VOID)); /* _ATTRIBUTE ((noreturn))); */ +_VOID _EXFUN(abort,(_VOID) _ATTRIBUTE(noreturn)); int _EXFUN(abs,(int)); int _EXFUN(atexit,(_VOID (*__func)(_VOID))); double _EXFUN(atof,(const char *__nptr)); @@ -77,7 +77,7 @@ _PTR _EXFUN(bsearch,(const _PTR __key, int _EXFNPTR(_compar,(const _PTR, const _PTR)))); _PTR _EXFUN_NOTHROW(calloc,(size_t __nmemb, size_t __size)); div_t _EXFUN(div,(int __numer, int __denom)); -_VOID _EXFUN(exit,(int __status)); /* _ATTRIBUTE ((noreturn))); */ +_VOID _EXFUN(exit,(int __status) _ATTRIBUTE(noreturn)); _VOID _EXFUN_NOTHROW(free,(_PTR)); char * _EXFUN(getenv,(const char *__string)); char * _EXFUN(_getenv_r,(struct _reent *, const char *__string)); @@ -107,14 +107,14 @@ int _EXFUN(mkostemp,(char *, int)); int _EXFUN(mkostemps,(char *, int, int)); int _EXFUN(mkstemp,(char *)); int _EXFUN(mkstemps,(char *, int)); -char * _EXFUN(mktemp,(char *)); /* _ATTRIBUTE ((__warning__ ("the use of `mktemp' is dangerous; use `mkstemp' instead")))); */ +char * _EXFUN(mktemp,(char *) _ATTRIBUTE (__warning__ ("the use of `mktemp' is dangerous; use `mkstemp' instead"))); #endif char * _EXFUN(_mkdtemp_r, (struct _reent *, char *)); int _EXFUN(_mkostemp_r, (struct _reent *, char *, int)); int _EXFUN(_mkostemps_r, (struct _reent *, char *, int, int)); int _EXFUN(_mkstemp_r, (struct _reent *, char *)); int _EXFUN(_mkstemps_r, (struct _reent *, char *, int)); -char * _EXFUN(_mktemp_r, (struct _reent *, char *)); /* _ATTRIBUTE ((__warning__ ("the use of `mktemp' is dangerous; use `mkstemp' instead")))); */ +char * _EXFUN(_mktemp_r, (struct _reent *, char *) _ATTRIBUTE (__warning__ ("the use of `mktemp' is dangerous; use `mkstemp' instead"))); #endif _VOID _EXFUN(qsort,(_PTR __base, size_t __nmemb, size_t __size, int(*_compar)(const _PTR, const _PTR))); int _EXFUN(rand,(_VOID)); @@ -144,7 +144,7 @@ long _EXFUN(a64l,(const char *__input)); char * _EXFUN(l64a,(long __input)); char * _EXFUN(_l64a_r,(struct _reent *,long __input)); int _EXFUN(on_exit,(_VOID (*__func)(int, _PTR),_PTR __arg)); -_VOID _EXFUN(_Exit,(int __status)); /* _ATTRIBUTE ((noreturn))); */ +_VOID _EXFUN(_Exit,(int __status) _ATTRIBUTE(noreturn)); int _EXFUN(putenv,(char *__string)); int _EXFUN(_putenv_r,(struct _reent *, char *__string)); _PTR _EXFUN(_reallocf_r,(struct _reent *, _PTR, size_t)); diff --git a/system/include/libc/sys/unistd.h b/system/include/libc/sys/unistd.h index 082c5e4dd7052..b0c6d5057e15f 100644 --- a/system/include/libc/sys/unistd.h +++ b/system/include/libc/sys/unistd.h @@ -14,7 +14,7 @@ extern "C" { extern char **environ; -void _EXFUN(_exit, (int __status )); /* _ATTRIBUTE ((noreturn))); */ +void _EXFUN(_exit, (int __status ) _ATTRIBUTE(noreturn)); int _EXFUN(access,(const char *__path, int __amode )); unsigned _EXFUN(alarm, (unsigned __secs )); From e51dd4eb52497a82792307e36e94f0787f59727d Mon Sep 17 00:00:00 2001 From: Bruce Mitchener Date: Sat, 23 Mar 2013 14:50:37 +0700 Subject: [PATCH 08/38] Node issue 1669 was fixed and these tests work. --- tests/runner.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/runner.py b/tests/runner.py index f0b5445ca9f09..f7f9cddd518db 100755 --- a/tests/runner.py +++ b/tests/runner.py @@ -2478,7 +2478,6 @@ def test_exceptions(self): Settings.EXCEPTION_DEBUG = 1 - self.banned_js_engines = [NODE_JS] # node issue 1669, exception causes stdout not to be flushed Settings.DISABLE_EXCEPTION_CATCHING = 0 if self.emcc_args is None: if Building.LLVM_OPTS: return self.skip('optimizing bitcode before emcc can confuse libcxx inclusion') @@ -7642,7 +7641,6 @@ def test_cases(self): try: os.environ['EMCC_LEAVE_INPUTS_RAW'] = '1' - #self.banned_js_engines = [NODE_JS] # node issue 1669, exception causes stdout not to be flushed Settings.CHECK_OVERFLOWS = 0 for name in glob.glob(path_from_root('tests', 'cases', '*.ll')): From 97258d653035184cbb65b7bc0403957b493ee4f3 Mon Sep 17 00:00:00 2001 From: Bruce Mitchener Date: Sat, 23 Mar 2013 14:50:58 +0700 Subject: [PATCH 09/38] test_mmap works with Node now. --- tests/runner.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/runner.py b/tests/runner.py index f7f9cddd518db..090606dcc5521 100755 --- a/tests/runner.py +++ b/tests/runner.py @@ -7192,7 +7192,6 @@ def test_fakestat(self): def test_mmap(self): if self.emcc_args is None: return self.skip('requires emcc') - self.banned_js_engines = [NODE_JS] # slower, and fail on 64-bit Settings.TOTAL_MEMORY = 128*1024*1024 From 4af9136347122abd9d7184c74fcb536a6cd8e719 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 25 Mar 2013 14:32:02 -0700 Subject: [PATCH 10/38] test fixes --- tests/runner.py | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/tests/runner.py b/tests/runner.py index e3b62110a63c4..3da7a685a7032 100755 --- a/tests/runner.py +++ b/tests/runner.py @@ -2475,17 +2475,14 @@ def test_longjmp4(self): def test_exceptions(self): if Settings.ASM_JS: return self.skip('no exceptions support in asm') if Settings.QUANTUM_SIZE == 1: return self.skip("we don't support libcxx in q1") + if self.emcc_args is None: return self.skip('need emcc to add in libcxx properly') Settings.EXCEPTION_DEBUG = 1 self.banned_js_engines = [NODE_JS] # node issue 1669, exception causes stdout not to be flushed Settings.DISABLE_EXCEPTION_CATCHING = 0 - if self.emcc_args is None: - if Building.LLVM_OPTS: return self.skip('optimizing bitcode before emcc can confuse libcxx inclusion') - self.emcc_args = [] # libc++ auto-inclusion is only done if we use emcc - else: - if '-O2' in self.emcc_args: - self.emcc_args += ['--closure', '1'] # Use closure here for some additional coverage + if '-O2' in self.emcc_args: + self.emcc_args += ['--closure', '1'] # Use closure here for some additional coverage src = ''' #include @@ -6247,6 +6244,8 @@ def test_direct_string_constant_usage(self): self.do_run(src, "some string constant") def test_std_cout_new(self): + if self.emcc_args is None: return self.skip('requires emcc') + src = ''' #include From a1fdf60cc92ce1a5fa4eee972c3d9a255c73bbb7 Mon Sep 17 00:00:00 2001 From: Alon Zakai Date: Mon, 25 Mar 2013 16:44:41 -0700 Subject: [PATCH 11/38] simplify handling of anonymous entry blocks; fixes #948 --- src/analyzer.js | 25 ++++++++++--------------- tests/cases/entry2.ll | 32 ++++++++++++++++++++++++++++++++ tests/cases/entry2.txt | 2 ++ 3 files changed, 44 insertions(+), 15 deletions(-) create mode 100644 tests/cases/entry2.ll create mode 100644 tests/cases/entry2.txt diff --git a/src/analyzer.js b/src/analyzer.js index b1991c3f9bbf2..6ed554140a3f1 100644 --- a/src/analyzer.js +++ b/src/analyzer.js @@ -9,7 +9,6 @@ var VAR_NATIVIZED = 'nativized'; var VAR_EMULATED = 'emulated'; var ENTRY_IDENT = toNiceIdent('%0'); -var ENTRY_IDENT_IDS = set(0, 1); // XXX function recomputeLines(func) { func.lines = func.labels.map(function(label) { return label.lines }).reduce(concatenator, []); @@ -1326,14 +1325,14 @@ function analyzer(data, sidePass) { func.labelsDict = {}; func.labelIds = {}; func.labelIdsInverse = {}; - func.labelIds[toNiceIdent('%0')] = 0; + func.labelIds[toNiceIdent('%0')] = 1; func.labelIdsInverse[0] = toNiceIdent('%0'); - func.labelIds[toNiceIdent('%1')] = 1; - func.labelIdsInverse[1] = toNiceIdent('%1'); func.labelIdCounter = 2; func.labels.forEach(function(label) { - func.labelIds[label.ident] = func.labelIdCounter++; - func.labelIdsInverse[func.labelIdCounter-1] = label.ident; + if (!(label.ident in func.labelIds)) { + func.labelIds[label.ident] = func.labelIdCounter++; + func.labelIdsInverse[func.labelIdCounter-1] = label.ident; + } }); // Minify label ids to numeric ids. @@ -1368,16 +1367,12 @@ function analyzer(data, sidePass) { } }); - // The entry might not have an explicit label, and there is no consistent naming convention for it - it can be %0 or %1 - // So we need to handle that in a special way here. function getActualLabelId(labelId) { if (func.labelsDict[labelId]) return labelId; - if (labelId in ENTRY_IDENT_IDS) { - labelId = func.labelIds[ENTRY_IDENT]; - assert(func.labelsDict[labelId]); - return labelId; - } - return null; + // If not present, it must be a surprisingly-named entry (or undefined behavior, in which case, still ok to use the entry) + labelId = func.labelIds[ENTRY_IDENT]; + assert(func.labelsDict[labelId]); + return labelId; } // Basic longjmp support, see library.js setjmp/longjmp @@ -1573,7 +1568,7 @@ function analyzer(data, sidePass) { } item.functions.forEach(function(func) { dprint('relooping', "// relooping function: " + func.ident); - func.block = makeBlock(func.labels, [toNiceIdent(func.labels[0].ident)], func.labelsDict, func.forceEmulated); + func.block = makeBlock(func.labels, [func.labels[0].ident], func.labelsDict, func.forceEmulated); }); return finish(); diff --git a/tests/cases/entry2.ll b/tests/cases/entry2.ll new file mode 100644 index 0000000000000..75b266c75910a --- /dev/null +++ b/tests/cases/entry2.ll @@ -0,0 +1,32 @@ +; ModuleID = '/tmp/tmpKnA2D3/a.out.bc' +target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32-S128" +target triple = "i386-pc-linux-gnu" + +@.str = private unnamed_addr constant [11 x i8] c"getgid=%d\0A\00", align 1 +@.str1 = private unnamed_addr constant [6 x i8] c"f=%d\0A\00", align 1 + +define internal i32 @_Z1fii(i32, i32) noinline { + %3 = tail call i32 @getgid() + %4 = icmp eq i32 %3, 0 + br i1 %4, label %7, label %5 + +;