#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
int /*<<< orphan*/ print_filter_help();
int /*<<< orphan*/ printf(char *);
void help() {
  printf("** Touchmon\n");
  printf("Test programm for input-events. This programm listens on event input "
         "devices\n");
  printf("and exports event metrics through a socket. Alternatively it "
         "requests these metrics\n");
  printf("through a socket and determines whether the test has passed or "
         "failed.\n");
  printf("In case that there is a socket specified as source as well as an "
         "input device, the higher event\n");
  printf("count of the two will be used to determine the test result\n\n");
  printf("** Options:\n");
  printf("  -i dev   Start event listener on the specified input device. This "
         "is usually one of the devices \n");
  printf("           in /dev/input/eventN\n");
  printf("  -s sock  Start metrics server on the specified socket.\n");
  printf("  -r sock  Request metrics on specified socket. (has no effect when "
         "-s is specified)\n");
  printf("  -l file  Log events to the specified file (only when -i option is "
         "active)\n\n");
  printf("  -o time  Specify a timeout in ms to listen for input (input source "
         "is specified either via -r or -i).\n");
  printf("           0 means no timeout (default)\n\n");
  printf("  -c count Specify a count for the event counter to be reached in "
         "order to pass the test.\n");
  printf("           You can give this option multiple times. The test is "
         "passed, when the event counter \n");
  printf("           is in the range from the lowest provided number to the "
         "highest. Example: '-c 4' => pass\n");
  printf("           when event counter equal to 4. Another Example: '-c 10 -c "
         "0' => pass when the counter is \n");
  printf("           less or equal than 10.\n\n");
  printf("  -d       Daemonize (only makes sense when starting a "
         "socket-server)\n");
  printf("  -z       Request the server to reset the event counter to zero, "
         "after receiving metric\n");
  printf("  -t       Request the server to terminate, after receiving metrics. "
         "(no effect, unless a socket is \n");
  printf("           specified via -r)\n");
  printf("  -p time  Poll the server for a maximum of <time> ms (0 means no "
         "timeout). This will wait until the \n");
  printf("           socket is reachable and will then \n");
  printf("           poll the server until it has completed setup (=> event "
         "thread is ready to receive events and\n");
  printf("           server is ready to serve requests).\n");
  printf("           If the -r option is present, the corresponding socket "
         "will be polled. Other requests \n");
  printf("           (e.g. -r, -z or -t) will be sent after that. If a "
         "daemonized server is started, (combination \n");
  printf("           of -d and -s), the parent will block until the server is "
         "ready\n\n");
  printf("  -f args  If the -i option has been specified, the events received "
         "from the device are filtered acording \n");
  printf("           to the filter specified in args. The -f option may be "
         "specified multiple times. Normally an \n");
  printf("           event is counted only if it passes all specified filters. "
         "If you specify '-f mode_or', an event\n");
  printf("           is counted if it passes at least one of the specified "
         "filters. For info about installed filters\n");
  printf("           and their arguments see 'Filters' below\n\n");
  printf("  -v       Be verbose. This will print out a status message for each "
         "request which was handled by the server\n");
  printf("  -vv      Be really verbose. This will print out debug messages on "
         "stderr to trace what the programm currently does\n");
  printf("  -vvv     Be extremely verbose. This will make the event thread "
         "write event-data to stderr for each received event\n");
  printf("  -q       Be quiet. Only the test's pass/fail message is printed\n");
  printf("  -h       Display this help message\n\n");
  printf("** Examples\n");
  printf("A use case for EMI tests would be:\n");
  printf("  First start the server to monitor the incomming events:\n");
  printf("    $ touchmon -d -s /touch_srv_socket -i /dev/input/event0\n");
  printf("  Then go on with the other tests. At the end of each session, check "
         "whether there where events\n");
  printf("  and reset the counter of the server:\n");
  printf("    $ touchmon -z -r /touch_srv_socket\n");
  printf("  Finally terminate the server:\n");
  printf("    $ touchmon -t -r /touch_srv_socket\n");
  printf("Note: the socket can be placed anywhere, as long as both processes "
         "have write access to it\n");
  printf("It is also possible to directly listen for events, without running a "
         "server:\n");
  printf("    $ touchmon -i /dev/input/event0 -o 60000 -c 50 -c 100\n");
  printf("  This will listen for one minute and pass the test if there are 50 "
         "to 100 events received\n\n");
  printf("** Filters\n");
  printf("Filters provide a flexible way to monitor the incomming events. To "
         "instantiate a Filter use the \n");
  printf("-f option with an argument conforming to the following syntax:\n");
  printf("  -f <FilterName>,<param1>,<param2>,<...>\n");
  printf("where <FilterName> is one of the installed filters, and <paramN> is "
         "a filter-specific parameter\n");
  printf("The following filters are installed:\n\n");
  print_filter_help();
}


x86 assembly (clang, -O0):
<help>:
push   %rbp
mov    %rsp,%rbp
lea    0xed5(%rip),%rdi
call   1030 <printf@plt>
lea    0xed6(%rip),%rdi
call   1030 <printf@plt>
lea    0xf18(%rip),%rdi
call   1030 <printf@plt>
lea    0xf61(%rip),%rdi
call   1030 <printf@plt>
lea    0xf9d(%rip),%rdi
call   1030 <printf@plt>
lea    0xff2(%rip),%rdi
call   1030 <printf@plt>
lea    0x1023(%rip),%rdi
call   1030 <printf@plt>
lea    0x1024(%rip),%rdi
call   1030 <printf@plt>
lea    0x107c(%rip),%rdi
call   1030 <printf@plt>
lea    0x1091(%rip),%rdi
call   1030 <printf@plt>
lea    0x10bf(%rip),%rdi
call   1030 <printf@plt>
lea    0x1109(%rip),%rdi
call   1030 <printf@plt>
lea    0x114b(%rip),%rdi
call   1030 <printf@plt>
lea    0x11a8(%rip),%rdi
call   1030 <printf@plt>
lea    0x11c6(%rip),%rdi
call   1030 <printf@plt>
lea    0x1215(%rip),%rdi
call   1030 <printf@plt>
lea    0x126a(%rip),%rdi
call   1030 <printf@plt>
lea    0x12c2(%rip),%rdi
call   1030 <printf@plt>
lea    0x131c(%rip),%rdi
call   1030 <printf@plt>
lea    0x1334(%rip),%rdi
call   1030 <printf@plt>
lea    0x136f(%rip),%rdi
call   1030 <printf@plt>
lea    0x13bd(%rip),%rdi
call   1030 <printf@plt>
lea    0x1417(%rip),%rdi
call   1030 <printf@plt>
lea    0x1429(%rip),%rdi
call   1030 <printf@plt>
lea    0x1484(%rip),%rdi
call   1030 <printf@plt>
lea    0x14a7(%rip),%rdi
call   1030 <printf@plt>
lea    0x1504(%rip),%rdi
call   1030 <printf@plt>
lea    0x1528(%rip),%rdi
call   1030 <printf@plt>
lea    0x157e(%rip),%rdi
call   1030 <printf@plt>
lea    0x15dc(%rip),%rdi
call   1030 <printf@plt>
lea    0x161c(%rip),%rdi
call   1030 <printf@plt>
lea    0x167c(%rip),%rdi
call   1030 <printf@plt>
lea    0x16d9(%rip),%rdi
call   1030 <printf@plt>
lea    0x1739(%rip),%rdi
call   1030 <printf@plt>
lea    0x1799(%rip),%rdi
call   1030 <printf@plt>
lea    0x17c2(%rip),%rdi
call   1030 <printf@plt>
lea    0x1824(%rip),%rdi
call   1030 <printf@plt>
lea    0x188e(%rip),%rdi
call   1030 <printf@plt>
lea    0x18f7(%rip),%rdi
call   1030 <printf@plt>
lea    0x192e(%rip),%rdi
call   1030 <printf@plt>
lea    0x1949(%rip),%rdi
call   1030 <printf@plt>
lea    0x194a(%rip),%rdi
call   1030 <printf@plt>
lea    0x1962(%rip),%rdi
call   1030 <printf@plt>
lea    0x1991(%rip),%rdi
call   1030 <printf@plt>
lea    0x19c2(%rip),%rdi
call   1030 <printf@plt>
lea    0x1a17(%rip),%rdi
call   1030 <printf@plt>
lea    0x1a33(%rip),%rdi
call   1030 <printf@plt>
lea    0x1a4f(%rip),%rdi
call   1030 <printf@plt>
lea    0x1a64(%rip),%rdi
call   1030 <printf@plt>
lea    0x1a80(%rip),%rdi
call   1030 <printf@plt>
lea    0x1ad0(%rip),%rdi
call   1030 <printf@plt>
lea    0x1b12(%rip),%rdi
call   1030 <printf@plt>
lea    0x1b41(%rip),%rdi
call   1030 <printf@plt>
lea    0x1b92(%rip),%rdi
call   1030 <printf@plt>
lea    0x1b92(%rip),%rdi
call   1030 <printf@plt>
lea    0x1be8(%rip),%rdi
call   1030 <printf@plt>
lea    0x1c1c(%rip),%rdi
call   1030 <printf@plt>
lea    0x1c3b(%rip),%rdi
call   1030 <printf@plt>
lea    0x1c90(%rip),%rdi
call   1030 <printf@plt>
mov    $0x0,%al
call   1040 <print_filter_help@plt>
pop    %rbp
ret

x86 assembly (clang, -O2):
<help>:
push   %rax
lea    0xed8(%rip),%rdi
call   1030 <puts@plt>
lea    0xed8(%rip),%rdi
call   1030 <puts@plt>
lea    0xf19(%rip),%rdi
call   1030 <puts@plt>
lea    0xf61(%rip),%rdi
call   1030 <puts@plt>
lea    0xf9c(%rip),%rdi
call   1030 <puts@plt>
lea    0xff0(%rip),%rdi
call   1030 <puts@plt>
lea    0x1020(%rip),%rdi
call   1030 <puts@plt>
lea    0x1020(%rip),%rdi
call   1030 <puts@plt>
lea    0x1077(%rip),%rdi
call   1030 <puts@plt>
lea    0x108b(%rip),%rdi
call   1030 <puts@plt>
lea    0x10b8(%rip),%rdi
call   1030 <puts@plt>
lea    0x1101(%rip),%rdi
call   1030 <puts@plt>
lea    0x1142(%rip),%rdi
call   1030 <puts@plt>
lea    0x119e(%rip),%rdi
call   1030 <puts@plt>
lea    0x11bb(%rip),%rdi
call   1030 <puts@plt>
lea    0x1209(%rip),%rdi
call   1030 <puts@plt>
lea    0x125d(%rip),%rdi
call   1030 <puts@plt>
lea    0x12b4(%rip),%rdi
call   1030 <puts@plt>
lea    0x130d(%rip),%rdi
call   1030 <puts@plt>
lea    0x1324(%rip),%rdi
call   1030 <puts@plt>
lea    0x135e(%rip),%rdi
call   1030 <puts@plt>
lea    0x13ab(%rip),%rdi
call   1030 <puts@plt>
lea    0x1404(%rip),%rdi
call   1030 <puts@plt>
lea    0x1415(%rip),%rdi
call   1030 <puts@plt>
lea    0x146f(%rip),%rdi
call   1030 <puts@plt>
lea    0x1491(%rip),%rdi
call   1030 <puts@plt>
lea    0x14ed(%rip),%rdi
call   1030 <puts@plt>
lea    0x1510(%rip),%rdi
call   1030 <puts@plt>
lea    0x1565(%rip),%rdi
call   1030 <puts@plt>
lea    0x15c2(%rip),%rdi
call   1030 <puts@plt>
lea    0x1601(%rip),%rdi
call   1030 <puts@plt>
lea    0x1660(%rip),%rdi
call   1030 <puts@plt>
lea    0x16bc(%rip),%rdi
call   1030 <puts@plt>
lea    0x171b(%rip),%rdi
call   1030 <puts@plt>
lea    0x177a(%rip),%rdi
call   1030 <puts@plt>
lea    0x17a2(%rip),%rdi
call   1030 <puts@plt>
lea    0x1803(%rip),%rdi
call   1030 <puts@plt>
lea    0x186c(%rip),%rdi
call   1030 <puts@plt>
lea    0x18d4(%rip),%rdi
call   1030 <puts@plt>
lea    0x190a(%rip),%rdi
call   1030 <puts@plt>
lea    0x1924(%rip),%rdi
call   1030 <puts@plt>
lea    0x1924(%rip),%rdi
call   1030 <puts@plt>
lea    0x193b(%rip),%rdi
call   1030 <puts@plt>
lea    0x1969(%rip),%rdi
call   1030 <puts@plt>
lea    0x1999(%rip),%rdi
call   1030 <puts@plt>
lea    0x19ed(%rip),%rdi
call   1030 <puts@plt>
lea    0x1a08(%rip),%rdi
call   1030 <puts@plt>
lea    0x1a23(%rip),%rdi
call   1030 <puts@plt>
lea    0x1a37(%rip),%rdi
call   1030 <puts@plt>
lea    0x1a52(%rip),%rdi
call   1030 <puts@plt>
lea    0x1aa1(%rip),%rdi
call   1030 <puts@plt>
lea    0x1ae2(%rip),%rdi
call   1030 <puts@plt>
lea    0x1b10(%rip),%rdi
call   1030 <puts@plt>
lea    0x1b60(%rip),%rdi
call   1030 <puts@plt>
lea    0x1b5f(%rip),%rdi
call   1030 <puts@plt>
lea    0x1bb4(%rip),%rdi
call   1030 <puts@plt>
lea    0x1be7(%rip),%rdi
call   1030 <puts@plt>
lea    0x1c05(%rip),%rdi
call   1030 <puts@plt>
lea    0x1c59(%rip),%rdi
call   1030 <puts@plt>
xor    %eax,%eax
pop    %rcx
jmp    1040 <print_filter_help@plt>

LLVM IR (-O0):
@.str = [13 x i8] c"** Touchmon\0A\00"
@.str.1 = [78 x i8] c"Test programm for input-events. This programm listens on event input devices\0A\00"
@.str.2 = [85 x i8] c"and exports event metrics through a socket. Alternatively it requests these metrics\0A\00"
@.str.3 = [72 x i8] c"through a socket and determines whether the test has passed or failed.\0A\00"
@.str.4 = [97 x i8] c"In case that there is a socket specified as source as well as an input device, the higher event\0A\00"
@.str.5 = [61 x i8] c"count of the two will be used to determine the test result\0A\0A\00"
@.str.6 = [13 x i8] c"** Options:\0A\00"
@.str.7 = [100 x i8] c" -i dev Start event listener on the specified input device. This is usually one of the devices \0A\00"
@.str.8 = [33 x i8] c" in /dev/input/eventN\0A\00"
@.str.9 = [58 x i8] c" -s sock Start metrics server on the specified socket.\0A\00"
@.str.10 = [86 x i8] c" -r sock Request metrics on specified socket. (has no effect when -s is specified)\0A\00"
@.str.11 = [78 x i8] c" -l file Log events to the specified file (only when -i option is active)\0A\0A\00"
@.str.12 = [105 x i8] c" -o time Specify a timeout in ms to listen for input (input source is specified either via -r or -i).\0A\00"
@.str.13 = [42 x i8] c" 0 means no timeout (default)\0A\0A\00"
@.str.14 = [91 x i8] c" -c count Specify a count for the event counter to be reached in order to pass the test.\0A\00"
@.str.15 = [97 x i8] c" You can give this option multiple times. The test is passed, when the event counter \0A\00"
@.str.16 = [100 x i8] c" is in the range from the lowest provided number to the highest. Example: '-c 4' => pass\0A\00"
@.str.17 = [102 x i8] c" when event counter equal to 4. Another Example: '-c 10 -c 0' => pass when the counter is \0A\00"
@.str.18 = [36 x i8] c" less or equal than 10.\0A\0A\00"
@.str.19 = [71 x i8] c" -d Daemonize (only makes sense when starting a socket-server)\0A\00"
@.str.20 = [90 x i8] c" -z Request the server to reset the event counter to zero, after receiving metric\0A\00"
@.str.21 = [102 x i8] c" -t Request the server to terminate, after receiving metrics. (no effect, unless a socket is \0A\00"
@.str.22 = [30 x i8] c" specified via -r)\0A\00"
@.str.23 = [103 x i8] c" -p time Poll the server for a maximum of <time> ms (0 means no timeout). This will wait until the \0A\00"
@.str.24 = [47 x i8] c" socket is reachable and will then \0A\00"
@.str.25 = [105 x i8] c" poll the server until it has completed setup (=> event thread is ready to receive events and\0A\00"
@.str.26 = [48 x i8] c" server is ready to serve requests).\0A\00"
@.str.27 = [98 x i8] c" If the -r option is present, the corresponding socket will be polled. Other requests \0A\00"
@.str.28 = [106 x i8] c" (e.g. -r, -z or -t) will be sent after that. If a daemonized server is started, (combination \0A\00"
@.str.29 = [76 x i8] c" of -d and -s), the parent will block until the server is ready\0A\0A\00"
@.str.30 = [108 x i8] c" -f args If the -i option has been specified, the events received from the device are filtered acording \0A\00"
@.str.31 = [105 x i8] c" to the filter specified in args. The -f option may be specified multiple times. Normally an \0A\00"
@.str.32 = [108 x i8] c" event is counted only if it passes all specified filters. If you specify '-f mode_or', an event\0A\00"
@.str.33 = [108 x i8] c" is counted if it passes at least one of the specified filters. For info about installed filters\0A\00"
@.str.34 = [53 x i8] c" and their arguments see 'Filters' below\0A\0A\00"
@.str.35 = [110 x i8] c" -v Be verbose. This will print out a status message for each request which was handled by the server\0A\00"
@.str.36 = [118 x i8] c" -vv Be really verbose. This will print out debug messages on stderr to trace what the programm currently does\0A\00"
@.str.37 = [117 x i8] c" -vvv Be extremely verbose. This will make the event thread write event-data to stderr for each received event\0A\00"
@.str.38 = [67 x i8] c" -q Be quiet. Only the test's pass/fail message is printed\0A\00"
@.str.39 = [39 x i8] c" -h Display this help message\0A\0A\00"
@.str.40 = [13 x i8] c"** Examples\0A\00"
@.str.41 = [36 x i8] c"A use case for EMI tests would be:\0A\00"
@.str.42 = [59 x i8] c" First start the server to monitor the incomming events:\0A\00"
@.str.43 = [61 x i8] c" $ touchmon -d -s /touch_srv_socket -i /dev/input/event0\0A\00"
@.str.44 = [97 x i8] c" Then go on with the other tests. At the end of each session, check whether there where events\0A\00"
@.str.45 = [40 x i8] c" and reset the counter of the server:\0A\00"
@.str.46 = [40 x i8] c" $ touchmon -z -r /touch_srv_socket\0A\00"
@.str.47 = [33 x i8] c" Finally terminate the server:\0A\00"
@.str.48 = [40 x i8] c" $ touchmon -t -r /touch_srv_socket\0A\00"
@.str.49 = [92 x i8] c"Note: the socket can be placed anywhere, as long as both processes have write access to it\0A\00"
@.str.50 = [78 x i8] c"It is also possible to directly listen for events, without running a server:\0A\00"
@.str.51 = [59 x i8] c" $ touchmon -i /dev/input/event0 -o 60000 -c 50 -c 100\0A\00"
@.str.52 = [93 x i8] c" This will listen for one minute and pass the test if there are 50 to 100 events received\0A\0A\00"
@.str.53 = [12 x i8] c"** Filters\0A\00"
@.str.54 = [98 x i8] c"Filters provide a flexible way to monitor the incomming events. To instantiate a Filter use the \0A\00"
@.str.55 = [64 x i8] c"-f option with an argument conforming to the following syntax:\0A\00"
@.str.56 = [43 x i8] c" -f <FilterName>,<param1>,<param2>,<...>\0A\00"
@.str.57 = [97 x i8] c"where <FilterName> is one of the installed filters, and <paramN> is a filter-specific parameter\0A\00"
@.str.58 = [39 x i8] c"The following filters are installed:\0A\0A\00"
define void @help() {
%1 = call i32 @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str, i64 0, i64 0))
%2 = call i32 @printf(i8* getelementptr inbounds ([78 x i8], [78 x i8]* @.str.1, i64 0, i64 0))
%3 = call i32 @printf(i8* getelementptr inbounds ([85 x i8], [85 x i8]* @.str.2, i64 0, i64 0))
%4 = call i32 @printf(i8* getelementptr inbounds ([72 x i8], [72 x i8]* @.str.3, i64 0, i64 0))
%5 = call i32 @printf(i8* getelementptr inbounds ([97 x i8], [97 x i8]* @.str.4, i64 0, i64 0))
%6 = call i32 @printf(i8* getelementptr inbounds ([61 x i8], [61 x i8]* @.str.5, i64 0, i64 0))
%7 = call i32 @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.6, i64 0, i64 0))
%8 = call i32 @printf(i8* getelementptr inbounds ([100 x i8], [100 x i8]* @.str.7, i64 0, i64 0))
%9 = call i32 @printf(i8* getelementptr inbounds ([33 x i8], [33 x i8]* @.str.8, i64 0, i64 0))
%10 = call i32 @printf(i8* getelementptr inbounds ([58 x i8], [58 x i8]* @.str.9, i64 0, i64 0))
%11 = call i32 @printf(i8* getelementptr inbounds ([86 x i8], [86 x i8]* @.str.10, i64 0, i64 0))
%12 = call i32 @printf(i8* getelementptr inbounds ([78 x i8], [78 x i8]* @.str.11, i64 0, i64 0))
%13 = call i32 @printf(i8* getelementptr inbounds ([105 x i8], [105 x i8]* @.str.12, i64 0, i64 0))
%14 = call i32 @printf(i8* getelementptr inbounds ([42 x i8], [42 x i8]* @.str.13, i64 0, i64 0))
%15 = call i32 @printf(i8* getelementptr inbounds ([91 x i8], [91 x i8]* @.str.14, i64 0, i64 0))
%16 = call i32 @printf(i8* getelementptr inbounds ([97 x i8], [97 x i8]* @.str.15, i64 0, i64 0))
%17 = call i32 @printf(i8* getelementptr inbounds ([100 x i8], [100 x i8]* @.str.16, i64 0, i64 0))
%18 = call i32 @printf(i8* getelementptr inbounds ([102 x i8], [102 x i8]* @.str.17, i64 0, i64 0))
%19 = call i32 @printf(i8* getelementptr inbounds ([36 x i8], [36 x i8]* @.str.18, i64 0, i64 0))
%20 = call i32 @printf(i8* getelementptr inbounds ([71 x i8], [71 x i8]* @.str.19, i64 0, i64 0))
%21 = call i32 @printf(i8* getelementptr inbounds ([90 x i8], [90 x i8]* @.str.20, i64 0, i64 0))
%22 = call i32 @printf(i8* getelementptr inbounds ([102 x i8], [102 x i8]* @.str.21, i64 0, i64 0))
%23 = call i32 @printf(i8* getelementptr inbounds ([30 x i8], [30 x i8]* @.str.22, i64 0, i64 0))
%24 = call i32 @printf(i8* getelementptr inbounds ([103 x i8], [103 x i8]* @.str.23, i64 0, i64 0))
%25 = call i32 @printf(i8* getelementptr inbounds ([47 x i8], [47 x i8]* @.str.24, i64 0, i64 0))
%26 = call i32 @printf(i8* getelementptr inbounds ([105 x i8], [105 x i8]* @.str.25, i64 0, i64 0))
%27 = call i32 @printf(i8* getelementptr inbounds ([48 x i8], [48 x i8]* @.str.26, i64 0, i64 0))
%28 = call i32 @printf(i8* getelementptr inbounds ([98 x i8], [98 x i8]* @.str.27, i64 0, i64 0))
%29 = call i32 @printf(i8* getelementptr inbounds ([106 x i8], [106 x i8]* @.str.28, i64 0, i64 0))
%30 = call i32 @printf(i8* getelementptr inbounds ([76 x i8], [76 x i8]* @.str.29, i64 0, i64 0))
%31 = call i32 @printf(i8* getelementptr inbounds ([108 x i8], [108 x i8]* @.str.30, i64 0, i64 0))
%32 = call i32 @printf(i8* getelementptr inbounds ([105 x i8], [105 x i8]* @.str.31, i64 0, i64 0))
%33 = call i32 @printf(i8* getelementptr inbounds ([108 x i8], [108 x i8]* @.str.32, i64 0, i64 0))
%34 = call i32 @printf(i8* getelementptr inbounds ([108 x i8], [108 x i8]* @.str.33, i64 0, i64 0))
%35 = call i32 @printf(i8* getelementptr inbounds ([53 x i8], [53 x i8]* @.str.34, i64 0, i64 0))
%36 = call i32 @printf(i8* getelementptr inbounds ([110 x i8], [110 x i8]* @.str.35, i64 0, i64 0))
%37 = call i32 @printf(i8* getelementptr inbounds ([118 x i8], [118 x i8]* @.str.36, i64 0, i64 0))
%38 = call i32 @printf(i8* getelementptr inbounds ([117 x i8], [117 x i8]* @.str.37, i64 0, i64 0))
%39 = call i32 @printf(i8* getelementptr inbounds ([67 x i8], [67 x i8]* @.str.38, i64 0, i64 0))
%40 = call i32 @printf(i8* getelementptr inbounds ([39 x i8], [39 x i8]* @.str.39, i64 0, i64 0))
%41 = call i32 @printf(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.40, i64 0, i64 0))
%42 = call i32 @printf(i8* getelementptr inbounds ([36 x i8], [36 x i8]* @.str.41, i64 0, i64 0))
%43 = call i32 @printf(i8* getelementptr inbounds ([59 x i8], [59 x i8]* @.str.42, i64 0, i64 0))
%44 = call i32 @printf(i8* getelementptr inbounds ([61 x i8], [61 x i8]* @.str.43, i64 0, i64 0))
%45 = call i32 @printf(i8* getelementptr inbounds ([97 x i8], [97 x i8]* @.str.44, i64 0, i64 0))
%46 = call i32 @printf(i8* getelementptr inbounds ([40 x i8], [40 x i8]* @.str.45, i64 0, i64 0))
%47 = call i32 @printf(i8* getelementptr inbounds ([40 x i8], [40 x i8]* @.str.46, i64 0, i64 0))
%48 = call i32 @printf(i8* getelementptr inbounds ([33 x i8], [33 x i8]* @.str.47, i64 0, i64 0))
%49 = call i32 @printf(i8* getelementptr inbounds ([40 x i8], [40 x i8]* @.str.48, i64 0, i64 0))
%50 = call i32 @printf(i8* getelementptr inbounds ([92 x i8], [92 x i8]* @.str.49, i64 0, i64 0))
%51 = call i32 @printf(i8* getelementptr inbounds ([78 x i8], [78 x i8]* @.str.50, i64 0, i64 0))
%52 = call i32 @printf(i8* getelementptr inbounds ([59 x i8], [59 x i8]* @.str.51, i64 0, i64 0))
%53 = call i32 @printf(i8* getelementptr inbounds ([93 x i8], [93 x i8]* @.str.52, i64 0, i64 0))
%54 = call i32 @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str.53, i64 0, i64 0))
%55 = call i32 @printf(i8* getelementptr inbounds ([98 x i8], [98 x i8]* @.str.54, i64 0, i64 0))
%56 = call i32 @printf(i8* getelementptr inbounds ([64 x i8], [64 x i8]* @.str.55, i64 0, i64 0))
%57 = call i32 @printf(i8* getelementptr inbounds ([43 x i8], [43 x i8]* @.str.56, i64 0, i64 0))
%58 = call i32 @printf(i8* getelementptr inbounds ([97 x i8], [97 x i8]* @.str.57, i64 0, i64 0))
%59 = call i32 @printf(i8* getelementptr inbounds ([39 x i8], [39 x i8]* @.str.58, i64 0, i64 0))
%60 = call i32 (...) @print_filter_help()
ret void
}

LLVM IR (-O2):
@str = [12 x i8] c"** Touchmon\00"
@str.59 = [77 x i8] c"Test programm for input-events. This programm listens on event input devices\00"
@str.60 = [84 x i8] c"and exports event metrics through a socket. Alternatively it requests these metrics\00"
@str.61 = [71 x i8] c"through a socket and determines whether the test has passed or failed.\00"
@str.62 = [96 x i8] c"In case that there is a socket specified as source as well as an input device, the higher event\00"
@str.63 = [60 x i8] c"count of the two will be used to determine the test result\0A\00"
@str.64 = [12 x i8] c"** Options:\00"
@str.65 = [99 x i8] c" -i dev Start event listener on the specified input device. This is usually one of the devices \00"
@str.66 = [32 x i8] c" in /dev/input/eventN\00"
@str.67 = [57 x i8] c" -s sock Start metrics server on the specified socket.\00"
@str.68 = [85 x i8] c" -r sock Request metrics on specified socket. (has no effect when -s is specified)\00"
@str.69 = [77 x i8] c" -l file Log events to the specified file (only when -i option is active)\0A\00"
@str.70 = [104 x i8] c" -o time Specify a timeout in ms to listen for input (input source is specified either via -r or -i).\00"
@str.71 = [41 x i8] c" 0 means no timeout (default)\0A\00"
@str.72 = [90 x i8] c" -c count Specify a count for the event counter to be reached in order to pass the test.\00"
@str.73 = [96 x i8] c" You can give this option multiple times. The test is passed, when the event counter \00"
@str.74 = [99 x i8] c" is in the range from the lowest provided number to the highest. Example: '-c 4' => pass\00"
@str.75 = [101 x i8] c" when event counter equal to 4. Another Example: '-c 10 -c 0' => pass when the counter is \00"
@str.76 = [35 x i8] c" less or equal than 10.\0A\00"
@str.77 = [70 x i8] c" -d Daemonize (only makes sense when starting a socket-server)\00"
@str.78 = [89 x i8] c" -z Request the server to reset the event counter to zero, after receiving metric\00"
@str.79 = [101 x i8] c" -t Request the server to terminate, after receiving metrics. (no effect, unless a socket is \00"
@str.80 = [29 x i8] c" specified via -r)\00"
@str.81 = [102 x i8] c" -p time Poll the server for a maximum of <time> ms (0 means no timeout). This will wait until the \00"
@str.82 = [46 x i8] c" socket is reachable and will then \00"
@str.83 = [104 x i8] c" poll the server until it has completed setup (=> event thread is ready to receive events and\00"
@str.84 = [47 x i8] c" server is ready to serve requests).\00"
@str.85 = [97 x i8] c" If the -r option is present, the corresponding socket will be polled. Other requests \00"
@str.86 = [105 x i8] c" (e.g. -r, -z or -t) will be sent after that. If a daemonized server is started, (combination \00"
@str.87 = [75 x i8] c" of -d and -s), the parent will block until the server is ready\0A\00"
@str.88 = [107 x i8] c" -f args If the -i option has been specified, the events received from the device are filtered acording \00"
@str.89 = [104 x i8] c" to the filter specified in args. The -f option may be specified multiple times. Normally an \00"
@str.90 = [107 x i8] c" event is counted only if it passes all specified filters. If you specify '-f mode_or', an event\00"
@str.91 = [107 x i8] c" is counted if it passes at least one of the specified filters. For info about installed filters\00"
@str.92 = [52 x i8] c" and their arguments see 'Filters' below\0A\00"
@str.93 = [109 x i8] c" -v Be verbose. This will print out a status message for each request which was handled by the server\00"
@str.94 = [117 x i8] c" -vv Be really verbose. This will print out debug messages on stderr to trace what the programm currently does\00"
@str.95 = [116 x i8] c" -vvv Be extremely verbose. This will make the event thread write event-data to stderr for each received event\00"
@str.96 = [66 x i8] c" -q Be quiet. Only the test's pass/fail message is printed\00"
@str.97 = [38 x i8] c" -h Display this help message\0A\00"
@str.98 = [12 x i8] c"** Examples\00"
@str.99 = [35 x i8] c"A use case for EMI tests would be:\00"
@str.100 = [58 x i8] c" First start the server to monitor the incomming events:\00"
@str.101 = [60 x i8] c" $ touchmon -d -s /touch_srv_socket -i /dev/input/event0\00"
@str.102 = [96 x i8] c" Then go on with the other tests. At the end of each session, check whether there where events\00"
@str.103 = [39 x i8] c" and reset the counter of the server:\00"
@str.104 = [39 x i8] c" $ touchmon -z -r /touch_srv_socket\00"
@str.105 = [32 x i8] c" Finally terminate the server:\00"
@str.106 = [39 x i8] c" $ touchmon -t -r /touch_srv_socket\00"
@str.107 = [91 x i8] c"Note: the socket can be placed anywhere, as long as both processes have write access to it\00"
@str.108 = [77 x i8] c"It is also possible to directly listen for events, without running a server:\00"
@str.109 = [58 x i8] c" $ touchmon -i /dev/input/event0 -o 60000 -c 50 -c 100\00"
@str.110 = [92 x i8] c" This will listen for one minute and pass the test if there are 50 to 100 events received\0A\00"
@str.111 = [11 x i8] c"** Filters\00"
@str.112 = [97 x i8] c"Filters provide a flexible way to monitor the incomming events. To instantiate a Filter use the \00"
@str.113 = [63 x i8] c"-f option with an argument conforming to the following syntax:\00"
@str.114 = [42 x i8] c" -f <FilterName>,<param1>,<param2>,<...>\00"
@str.115 = [96 x i8] c"where <FilterName> is one of the installed filters, and <paramN> is a filter-specific parameter\00"
@str.116 = [38 x i8] c"The following filters are installed:\0A\00"
define void @help() {
%1 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([12 x i8], [12 x i8]* @str, i64 0, i64 0))
%2 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([77 x i8], [77 x i8]* @str.59, i64 0, i64 0))
%3 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([84 x i8], [84 x i8]* @str.60, i64 0, i64 0))
%4 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([71 x i8], [71 x i8]* @str.61, i64 0, i64 0))
%5 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([96 x i8], [96 x i8]* @str.62, i64 0, i64 0))
%6 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([60 x i8], [60 x i8]* @str.63, i64 0, i64 0))
%7 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([12 x i8], [12 x i8]* @str.64, i64 0, i64 0))
%8 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([99 x i8], [99 x i8]* @str.65, i64 0, i64 0))
%9 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([32 x i8], [32 x i8]* @str.66, i64 0, i64 0))
%10 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([57 x i8], [57 x i8]* @str.67, i64 0, i64 0))
%11 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([85 x i8], [85 x i8]* @str.68, i64 0, i64 0))
%12 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([77 x i8], [77 x i8]* @str.69, i64 0, i64 0))
%13 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([104 x i8], [104 x i8]* @str.70, i64 0, i64 0))
%14 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([41 x i8], [41 x i8]* @str.71, i64 0, i64 0))
%15 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([90 x i8], [90 x i8]* @str.72, i64 0, i64 0))
%16 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([96 x i8], [96 x i8]* @str.73, i64 0, i64 0))
%17 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([99 x i8], [99 x i8]* @str.74, i64 0, i64 0))
%18 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([101 x i8], [101 x i8]* @str.75, i64 0, i64 0))
%19 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([35 x i8], [35 x i8]* @str.76, i64 0, i64 0))
%20 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([70 x i8], [70 x i8]* @str.77, i64 0, i64 0))
%21 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([89 x i8], [89 x i8]* @str.78, i64 0, i64 0))
%22 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([101 x i8], [101 x i8]* @str.79, i64 0, i64 0))
%23 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([29 x i8], [29 x i8]* @str.80, i64 0, i64 0))
%24 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([102 x i8], [102 x i8]* @str.81, i64 0, i64 0))
%25 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([46 x i8], [46 x i8]* @str.82, i64 0, i64 0))
%26 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([104 x i8], [104 x i8]* @str.83, i64 0, i64 0))
%27 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([47 x i8], [47 x i8]* @str.84, i64 0, i64 0))
%28 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([97 x i8], [97 x i8]* @str.85, i64 0, i64 0))
%29 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([105 x i8], [105 x i8]* @str.86, i64 0, i64 0))
%30 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([75 x i8], [75 x i8]* @str.87, i64 0, i64 0))
%31 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([107 x i8], [107 x i8]* @str.88, i64 0, i64 0))
%32 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([104 x i8], [104 x i8]* @str.89, i64 0, i64 0))
%33 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([107 x i8], [107 x i8]* @str.90, i64 0, i64 0))
%34 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([107 x i8], [107 x i8]* @str.91, i64 0, i64 0))
%35 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([52 x i8], [52 x i8]* @str.92, i64 0, i64 0))
%36 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([109 x i8], [109 x i8]* @str.93, i64 0, i64 0))
%37 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([117 x i8], [117 x i8]* @str.94, i64 0, i64 0))
%38 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([116 x i8], [116 x i8]* @str.95, i64 0, i64 0))
%39 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([66 x i8], [66 x i8]* @str.96, i64 0, i64 0))
%40 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([38 x i8], [38 x i8]* @str.97, i64 0, i64 0))
%41 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([12 x i8], [12 x i8]* @str.98, i64 0, i64 0))
%42 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([35 x i8], [35 x i8]* @str.99, i64 0, i64 0))
%43 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([58 x i8], [58 x i8]* @str.100, i64 0, i64 0))
%44 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([60 x i8], [60 x i8]* @str.101, i64 0, i64 0))
%45 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([96 x i8], [96 x i8]* @str.102, i64 0, i64 0))
%46 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([39 x i8], [39 x i8]* @str.103, i64 0, i64 0))
%47 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([39 x i8], [39 x i8]* @str.104, i64 0, i64 0))
%48 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([32 x i8], [32 x i8]* @str.105, i64 0, i64 0))
%49 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([39 x i8], [39 x i8]* @str.106, i64 0, i64 0))
%50 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([91 x i8], [91 x i8]* @str.107, i64 0, i64 0))
%51 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([77 x i8], [77 x i8]* @str.108, i64 0, i64 0))
%52 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([58 x i8], [58 x i8]* @str.109, i64 0, i64 0))
%53 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([92 x i8], [92 x i8]* @str.110, i64 0, i64 0))
%54 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([11 x i8], [11 x i8]* @str.111, i64 0, i64 0))
%55 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([97 x i8], [97 x i8]* @str.112, i64 0, i64 0))
%56 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([63 x i8], [63 x i8]* @str.113, i64 0, i64 0))
%57 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([42 x i8], [42 x i8]* @str.114, i64 0, i64 0))
%58 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([96 x i8], [96 x i8]* @str.115, i64 0, i64 0))
%59 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([38 x i8], [38 x i8]* @str.116, i64 0, i64 0))
%60 = tail call i32 (...) @print_filter_help()
ret void
}