]> git.saurik.com Git - apple/icu.git/blobdiff - icuSources/test/unalignedtest/unaligned.c
ICU-6.2.22.tar.gz
[apple/icu.git] / icuSources / test / unalignedtest / unaligned.c
diff --git a/icuSources/test/unalignedtest/unaligned.c b/icuSources/test/unalignedtest/unaligned.c
new file mode 100644 (file)
index 0000000..69137a3
--- /dev/null
@@ -0,0 +1,304 @@
+/*
+
+    This program is a wrapper to assist in debugging analigned traps on the Alpha
+
+    architectures.
+
+
+
+    COPYRIGHT AND PERMISSION NOTICE
+
+
+
+    Copyright (c) 2002 Sean Hunter
+
+
+
+    Permission is hereby granted, free of charge, to any person obtaining a
+
+    copy of this software and associated documentation files (the
+
+    "Software"), to deal in the Software without restriction, including
+
+    without limitation the rights to use, copy, modify, merge, publish,
+
+    distribute, and/or sell copies of the Software, and to permit persons
+
+    to whom the Software is furnished to do so, provided that the above
+
+    copyright notice(s) and this permission notice appear in all copies of
+
+    the Software and that both the above copyright notice(s) and this
+
+    permission notice appear in supporting documentation.
+
+
+
+    THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+
+    OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+
+    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+
+    OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
+
+    HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL
+
+    INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING
+
+    FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+
+    NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
+
+    WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+
+
+    Except as contained in this notice, the name of a copyright holder
+
+    shall not be used in advertising or otherwise to promote the sale, use
+
+    or other dealings in this Software without prior written authorization
+
+    of the copyright holder.
+
+
+
+    --------------------------------------------------------------------------------
+
+    All trademarks and registered trademarks mentioned herein are the property
+
+    of their respective owners.  
+
+
+
+*/
+
+#include <errno.h>
+
+#include <stdio.h>
+
+
+
+#include <asm/sysinfo.h>
+
+#include <asm/unistd.h>
+
+
+
+#define TMP_PATH_MAX 1024
+
+
+
+
+
+static int 
+
+setsysinfo(unsigned long op, void *buffer, unsigned long size,
+
+                     int *start, void *arg, unsigned long flag)
+
+{
+
+       syscall(__NR_osf_setsysinfo, op, buffer, size, start, arg, flag);
+
+}
+
+
+
+
+
+void 
+
+trap_unaligned(void)
+
+{
+
+       unsigned int buf[2];
+
+       buf[0] = SSIN_UACPROC;
+
+       buf[1] = UAC_SIGBUS | UAC_NOPRINT;
+
+       setsysinfo(SSI_NVPAIRS, buf, 1, 0, 0, 0);
+
+}
+
+
+
+
+
+static void 
+
+usage(void)
+
+{
+
+        fprintf(stderr,
+
+               "usage: unaligned [-b] <command-path> [command-args...]\n\n"
+
+               "  This program is designed to assist debugging of\n"
+
+               "  unaligned traps by running the program in gdb\n"
+
+               "  and causing it to get SIGBUS when it encounters\n"
+
+               "  an unaligned trap.\n\n"
+
+               "  It is free software written by Sean Hunter <sean@uncarved.co.uk>\n"
+
+               "  based on code by Richard Henderson and Andrew Morgan.\n\n"
+
+       );
+
+
+
+       exit(1);
+
+}
+
+
+
+
+
+int 
+
+main(int argc, char **argv)
+
+{
+
+       const char my_debugger[] = "/usr/bin/gdb";
+
+
+
+       char *temp_str;
+
+       char *curr;
+
+       int size = 0;
+
+       int curr_arg;
+
+       int isBatchMode = 0;
+
+
+
+       /* check that we have at least 1 argument */
+
+       if (argc < 2) {
+
+               usage();
+
+       }
+
+       if( strcmp("-b" , argv[1]) == 0 ){
+
+           isBatchMode = 1;
+
+           curr_arg = 2;
+
+        }else{
+
+           curr_arg = 1;
+
+       }        
+
+
+
+       trap_unaligned();
+
+
+
+       if (argc > 2) {
+
+               /* We're going to use bash process redirection to create a "file" for gdb to read
+
+                * containing the arguments we need */
+
+               size = 2048;
+
+               for(; curr_arg < argc; curr_arg++) {
+
+                       size += strlen(argv[curr_arg]);
+
+               }
+
+               temp_str = (char *) malloc(sizeof(char) * size);
+
+               if (!temp_str) {
+
+                   fprintf(stderr, "Unable to malloc memory for string use: %s\n", strerror(errno));
+
+                   exit(255);
+
+               }
+
+               if(isBatchMode==1){
+
+                       sprintf(temp_str, "%s -batch %s -x <( echo file %s; echo set args", my_debugger, argv[2], argv[2]);
+
+               }else{
+
+                       sprintf(temp_str, "%s %s -x <( echo file %s; echo set args", my_debugger, argv[1], argv[1]);
+
+               }
+
+               curr = temp_str + strlen(temp_str);
+
+               for(curr_arg = 2; curr_arg < argc; curr_arg++) {
+
+                       sprintf(curr, " %s", argv[curr_arg]);
+
+                       curr = temp_str + strlen(temp_str);
+
+               }
+
+#ifndef NOAUTORUN
+
+               curr = temp_str + strlen(temp_str);
+
+               sprintf(curr, "; echo run");
+
+#endif 
+
+               curr = temp_str + strlen(temp_str);
+
+               sprintf(curr, ")");
+
+
+
+               execlp("/bin/bash", "/bin/bash", "-c", temp_str, NULL);
+
+
+
+       }
+
+       else {
+
+               execlp(my_debugger, my_debugger, argv[1], NULL);
+
+       }       
+
+
+
+       /* if we fall through to here, our exec failed -- announce the fact */
+
+       fprintf(stderr, "Unable to execute command: %s\n", strerror(errno));
+
+
+
+       usage();
+
+
+
+}
+
+
+
+/* use gcc unaligned.c -o unaliged to compile.  Add -DNOAUTORUN if you
+
+don't want gdb to automatically run the program */
+
+
+