#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 */
typedef int /*<<< orphan*/ FILE;

/* Variables and functions */
int /*<<< orphan*/ assert(int /*<<< orphan*/);
int /*<<< orphan*/ fprintf(int /*<<< orphan*/ *, char *, ...);
char *get_program_name();
void print_usage(FILE *fp) {
  const char *program_name = get_program_name();
  assert(fp != NULL);
  assert(program_name != NULL);
  fprintf(fp,
          ("Usage:\n"
           "\t%s [options...] hostname port\n"
           "\t%s -l -p port [-s addr] [options...] [hostname] [port]\n\n"
           "Recognized options are:\n"),
          program_name, program_name);
  fprintf(fp, " -4, --ipv4             %s\n", ("Use only IPv4"));
  fprintf(fp, " -6, --ipv6             %s\n", ("Use only IPv6"));
  fprintf(fp, " -a, --any-protocol     %s\n",
          ("Use any available protocol (default is TCP)"));
  fprintf(fp, " -b, --bluetooth        %s\n",
          ("Use Bluetooth (defaults to L2CAP protocol)"));
  fprintf(fp, " --buffer-size=BYTES    %s\n", ("Set buffer size"));
  fprintf(fp, " --continuous           %s\n",
          ("Continuously accept connections\n"
           "                        (only in listen mode with --exec)"));
  fprintf(fp, " --disable-nagle        %s\n",
          ("Disable nagle algorithm for TCP connections"));
  fprintf(fp, " -e, --exec=CMD         %s\n", ("Exec command after connect"));
  fprintf(fp, " --half-close           %s\n",
          ("Handle network half-closes correctly"));
  fprintf(fp, " -h, --help             %s\n", ("Display help"));
  fprintf(fp, " -l, --listen           %s\n",
          ("Listen mode, for inbound connects"));
  fprintf(fp, " --mtu=BYTES            %s\n",
          ("Set MTU for network connection transmits"));
  fprintf(fp, " -n                     %s\n",
          ("Numeric-only IP addresses, no DNS"));
  fprintf(fp, " --no-reuseaddr         %s\n",
          ("Disable SO_REUSEADDR socket option\n"
           "                        (only in listen mode)"));
  fprintf(fp, " --nru=BYTES            %s\n",
          ("Set NRU for network connection receives"));
  fprintf(fp, " -p, --port=PORT        %s\n", ("Local port"));
  fprintf(fp,
          " -q, --hold-timeout=SEC1[:SEC2]\n"
          "                        %s\n",
          ("Set hold timeout(s) for local [and remote]"));
  fprintf(fp, " --rcvbuf-size          %s\n",
          ("Kernel receive buffer size for network sockets"));
  fprintf(fp, " --recv-only            %s\n",
          ("Only receive data, don't transmit"));
  fprintf(fp, " -s, --address=ADDRESS  %s\n", ("Local source address"));
  fprintf(fp, " --sco                  %s\n",
          ("Use SCO protocol over Bluetooth"));
  fprintf(fp, " --send-only            %s\n",
          ("Only transmit data, don't receive"));
  fprintf(fp, " --sndbuf-size          %s\n",
          ("Kernel send buffer size for network sockets"));
  fprintf(fp,
          " --socktype=[stream|dgram|seqpacket]"
          "                        %s\n",
          ("Socket type to use. Default is stream."));
  fprintf(fp,
          " -t, --idle-timeout=SECONDS\n"
          "                        %s\n",
          ("Idle connection timeout"));
  fprintf(fp, " -u, --udp              %s\n",
          ("Require use of UDP protocol (implies -d)"));
  fprintf(fp, " -v, --verbose          %s\n",
          ("Increase program verbosity\n"
           "                        (call twice for max verbosity)"));
  fprintf(fp, " --version              %s\n",
          ("Display nc6 version information"));
  fprintf(fp, " -w, --timeout=SECONDS  %s\n", ("Timeout for connects/accepts"));
  fprintf(fp, " -x, --transfer         %s\n", ("File transfer mode"));
  fprintf(fp, " -X, --rev-transfer     %s\n",
          ("File transfer mode (reverse direction)"));
  fprintf(fp, "\n");
}


x86 assembly (clang, -O0):
<print_usage>:
push   %rbp
mov    %rsp,%rbp
sub    $0x10,%rsp
mov    %rdi,-0x8(%rbp)
mov    $0x0,%al
call   1050 <get_program_name@plt>
mov    %rax,-0x10(%rbp)
cmpq   $0x0,-0x8(%rbp)
setne  %al
and    $0x1,%al
movzbl %al,%edi
call   1030 <assert@plt>
cmpq   $0x0,-0x10(%rbp)
setne  %al
and    $0x1,%al
movzbl %al,%edi
call   1030 <assert@plt>
mov    -0x8(%rbp),%rdi
mov    -0x10(%rbp),%rdx
mov    -0x10(%rbp),%rcx
lea    0xe82(%rip),%rsi
mov    $0x0,%al
call   1040 <fprintf@plt>
mov    -0x8(%rbp),%rdi
lea    0xee8(%rip),%rsi
lea    0xefd(%rip),%rdx
mov    $0x0,%al
call   1040 <fprintf@plt>
mov    -0x8(%rbp),%rdi
lea    0xef9(%rip),%rsi
lea    0xf0e(%rip),%rdx
mov    $0x0,%al
call   1040 <fprintf@plt>
mov    -0x8(%rbp),%rdi
lea    0xf0a(%rip),%rsi
lea    0xf1f(%rip),%rdx
mov    $0x0,%al
call   1040 <fprintf@plt>
mov    -0x8(%rbp),%rdi
lea    0xf39(%rip),%rsi
lea    0xf4e(%rip),%rdx
mov    $0x0,%al
call   1040 <fprintf@plt>
mov    -0x8(%rbp),%rdi
lea    0xf67(%rip),%rsi
lea    0xf7c(%rip),%rdx
mov    $0x0,%al
call   1040 <fprintf@plt>
mov    -0x8(%rbp),%rdi
lea    0xf7a(%rip),%rsi
lea    0xf8f(%rip),%rdx
mov    $0x0,%al
call   1040 <fprintf@plt>
mov    -0x8(%rbp),%rdi
lea    0xfd7(%rip),%rsi
lea    0xfec(%rip),%rdx
mov    $0x0,%al
call   1040 <fprintf@plt>
mov    -0x8(%rbp),%rdi
lea    0x1006(%rip),%rsi
lea    0x101b(%rip),%rdx
mov    $0x0,%al
call   1040 <fprintf@plt>
mov    -0x8(%rbp),%rdi
lea    0x1024(%rip),%rsi
lea    0x1039(%rip),%rdx
mov    $0x0,%al
call   1040 <fprintf@plt>
mov    -0x8(%rbp),%rdi
lea    0x104c(%rip),%rsi
lea    0x1061(%rip),%rdx
mov    $0x0,%al
call   1040 <fprintf@plt>
mov    -0x8(%rbp),%rdi
lea    0x105c(%rip),%rsi
lea    0x1071(%rip),%rdx
mov    $0x0,%al
call   1040 <fprintf@plt>
mov    -0x8(%rbp),%rdi
lea    0x1081(%rip),%rsi
lea    0x1096(%rip),%rdx
mov    $0x0,%al
call   1040 <fprintf@plt>
mov    -0x8(%rbp),%rdi
lea    0x10ad(%rip),%rsi
lea    0x10c2(%rip),%rdx
mov    $0x0,%al
call   1040 <fprintf@plt>
mov    -0x8(%rbp),%rdi
lea    0x10d2(%rip),%rsi
lea    0x10e7(%rip),%rdx
mov    $0x0,%al
call   1040 <fprintf@plt>
mov    -0x8(%rbp),%rdi
lea    0x1126(%rip),%rsi
lea    0x113b(%rip),%rdx
mov    $0x0,%al
call   1040 <fprintf@plt>
mov    -0x8(%rbp),%rdi
lea    0x1151(%rip),%rsi
lea    0x1166(%rip),%rdx
mov    $0x0,%al
call   1040 <fprintf@plt>
mov    -0x8(%rbp),%rdi
lea    0x115f(%rip),%rsi
lea    0x1194(%rip),%rdx
mov    $0x0,%al
call   1040 <fprintf@plt>
mov    -0x8(%rbp),%rdi
lea    0x11ad(%rip),%rsi
lea    0x11c2(%rip),%rdx
mov    $0x0,%al
call   1040 <fprintf@plt>
mov    -0x8(%rbp),%rdi
lea    0x11df(%rip),%rsi
lea    0x11f4(%rip),%rdx
mov    $0x0,%al
call   1040 <fprintf@plt>
mov    -0x8(%rbp),%rdi
lea    0x1204(%rip),%rsi
lea    0x1219(%rip),%rdx
mov    $0x0,%al
call   1040 <fprintf@plt>
mov    -0x8(%rbp),%rdi
lea    0x121c(%rip),%rsi
lea    0x1231(%rip),%rdx
mov    $0x0,%al
call   1040 <fprintf@plt>
mov    -0x8(%rbp),%rdi
lea    0x123f(%rip),%rsi
lea    0x1254(%rip),%rdx
mov    $0x0,%al
call   1040 <fprintf@plt>
mov    -0x8(%rbp),%rdi
lea    0x1264(%rip),%rsi
lea    0x1279(%rip),%rdx
mov    $0x0,%al
call   1040 <fprintf@plt>
mov    -0x8(%rbp),%rdi
lea    0x1293(%rip),%rsi
lea    0x12cc(%rip),%rdx
mov    $0x0,%al
call   1040 <fprintf@plt>
mov    -0x8(%rbp),%rdi
lea    0x12e1(%rip),%rsi
lea    0x1312(%rip),%rdx
mov    $0x0,%al
call   1040 <fprintf@plt>
mov    -0x8(%rbp),%rdi
lea    0x1318(%rip),%rsi
lea    0x132d(%rip),%rdx
mov    $0x0,%al
call   1040 <fprintf@plt>
mov    -0x8(%rbp),%rdi
lea    0x1344(%rip),%rsi
lea    0x1359(%rip),%rdx
mov    $0x0,%al
call   1040 <fprintf@plt>
mov    -0x8(%rbp),%rdi
lea    0x1399(%rip),%rsi
lea    0x13ae(%rip),%rdx
mov    $0x0,%al
call   1040 <fprintf@plt>
mov    -0x8(%rbp),%rdi
lea    0x13bc(%rip),%rsi
lea    0x13d1(%rip),%rdx
mov    $0x0,%al
call   1040 <fprintf@plt>
mov    -0x8(%rbp),%rdi
lea    0x13dc(%rip),%rsi
lea    0x13f1(%rip),%rdx
mov    $0x0,%al
call   1040 <fprintf@plt>
mov    -0x8(%rbp),%rdi
lea    0x13f2(%rip),%rsi
lea    0x1407(%rip),%rdx
mov    $0x0,%al
call   1040 <fprintf@plt>
mov    -0x8(%rbp),%rdi
lea    0xbdf(%rip),%rsi
mov    $0x0,%al
call   1040 <fprintf@plt>
add    $0x10,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<print_usage>:
push   %r14
push   %rbx
push   %rax
mov    %rdi,%rbx
xor    %eax,%eax
call   1060 <get_program_name@plt>
mov    %rax,%r14
xor    %edi,%edi
test   %rbx,%rbx
setne  %dil
call   1040 <assert@plt>
xor    %edi,%edi
test   %r14,%r14
setne  %dil
call   1040 <assert@plt>
lea    0xe8c(%rip),%rsi
mov    %rbx,%rdi
mov    %r14,%rdx
mov    %r14,%rcx
xor    %eax,%eax
call   1050 <fprintf@plt>
lea    0xeed(%rip),%rsi
lea    0xf02(%rip),%rdx
mov    %rbx,%rdi
xor    %eax,%eax
call   1050 <fprintf@plt>
lea    0xeff(%rip),%rsi
lea    0xf14(%rip),%rdx
mov    %rbx,%rdi
xor    %eax,%eax
call   1050 <fprintf@plt>
lea    0xf11(%rip),%rsi
lea    0xf26(%rip),%rdx
mov    %rbx,%rdi
xor    %eax,%eax
call   1050 <fprintf@plt>
lea    0xf41(%rip),%rsi
lea    0xf56(%rip),%rdx
mov    %rbx,%rdi
xor    %eax,%eax
call   1050 <fprintf@plt>
lea    0xf70(%rip),%rsi
lea    0xf85(%rip),%rdx
mov    %rbx,%rdi
xor    %eax,%eax
call   1050 <fprintf@plt>
lea    0xf84(%rip),%rsi
lea    0xf99(%rip),%rdx
mov    %rbx,%rdi
xor    %eax,%eax
call   1050 <fprintf@plt>
lea    0xfe2(%rip),%rsi
lea    0xff7(%rip),%rdx
mov    %rbx,%rdi
xor    %eax,%eax
call   1050 <fprintf@plt>
lea    0x1012(%rip),%rsi
lea    0x1027(%rip),%rdx
mov    %rbx,%rdi
xor    %eax,%eax
call   1050 <fprintf@plt>
lea    0x1031(%rip),%rsi
lea    0x1046(%rip),%rdx
mov    %rbx,%rdi
xor    %eax,%eax
call   1050 <fprintf@plt>
lea    0x105a(%rip),%rsi
lea    0x106f(%rip),%rdx
mov    %rbx,%rdi
xor    %eax,%eax
call   1050 <fprintf@plt>
lea    0x106b(%rip),%rsi
lea    0x1080(%rip),%rdx
mov    %rbx,%rdi
xor    %eax,%eax
call   1050 <fprintf@plt>
lea    0x1091(%rip),%rsi
lea    0x10a6(%rip),%rdx
mov    %rbx,%rdi
xor    %eax,%eax
call   1050 <fprintf@plt>
lea    0x10be(%rip),%rsi
lea    0x10d3(%rip),%rdx
mov    %rbx,%rdi
xor    %eax,%eax
call   1050 <fprintf@plt>
lea    0x10e4(%rip),%rsi
lea    0x10f9(%rip),%rdx
mov    %rbx,%rdi
xor    %eax,%eax
call   1050 <fprintf@plt>
lea    0x1139(%rip),%rsi
lea    0x114e(%rip),%rdx
mov    %rbx,%rdi
xor    %eax,%eax
call   1050 <fprintf@plt>
lea    0x1165(%rip),%rsi
lea    0x117a(%rip),%rdx
mov    %rbx,%rdi
xor    %eax,%eax
call   1050 <fprintf@plt>
lea    0x1174(%rip),%rsi
lea    0x11a9(%rip),%rdx
mov    %rbx,%rdi
xor    %eax,%eax
call   1050 <fprintf@plt>
lea    0x11c3(%rip),%rsi
lea    0x11d8(%rip),%rdx
mov    %rbx,%rdi
xor    %eax,%eax
call   1050 <fprintf@plt>
lea    0x11f6(%rip),%rsi
lea    0x120b(%rip),%rdx
mov    %rbx,%rdi
xor    %eax,%eax
call   1050 <fprintf@plt>
lea    0x121c(%rip),%rsi
lea    0x1231(%rip),%rdx
mov    %rbx,%rdi
xor    %eax,%eax
call   1050 <fprintf@plt>
lea    0x1235(%rip),%rsi
lea    0x124a(%rip),%rdx
mov    %rbx,%rdi
xor    %eax,%eax
call   1050 <fprintf@plt>
lea    0x1259(%rip),%rsi
lea    0x126e(%rip),%rdx
mov    %rbx,%rdi
xor    %eax,%eax
call   1050 <fprintf@plt>
lea    0x127f(%rip),%rsi
lea    0x1294(%rip),%rdx
mov    %rbx,%rdi
xor    %eax,%eax
call   1050 <fprintf@plt>
lea    0x12af(%rip),%rsi
lea    0x12e8(%rip),%rdx
mov    %rbx,%rdi
xor    %eax,%eax
call   1050 <fprintf@plt>
lea    0x12fe(%rip),%rsi
lea    0x132f(%rip),%rdx
mov    %rbx,%rdi
xor    %eax,%eax
call   1050 <fprintf@plt>
lea    0x1336(%rip),%rsi
lea    0x134b(%rip),%rdx
mov    %rbx,%rdi
xor    %eax,%eax
call   1050 <fprintf@plt>
lea    0x1363(%rip),%rsi
lea    0x1378(%rip),%rdx
mov    %rbx,%rdi
xor    %eax,%eax
call   1050 <fprintf@plt>
lea    0x13b9(%rip),%rsi
lea    0x13ce(%rip),%rdx
mov    %rbx,%rdi
xor    %eax,%eax
call   1050 <fprintf@plt>
lea    0x13dd(%rip),%rsi
lea    0x13f2(%rip),%rdx
mov    %rbx,%rdi
xor    %eax,%eax
call   1050 <fprintf@plt>
lea    0x13fe(%rip),%rsi
lea    0x1413(%rip),%rdx
mov    %rbx,%rdi
xor    %eax,%eax
call   1050 <fprintf@plt>
lea    0x1415(%rip),%rsi
lea    0x142a(%rip),%rdx
mov    %rbx,%rdi
xor    %eax,%eax
call   1050 <fprintf@plt>
mov    $0xa,%edi
mov    %rbx,%rsi
add    $0x8,%rsp
pop    %rbx
pop    %r14
jmp    1030 <fputc@plt>

LLVM IR (-O0):
@.str = [120 x i8] c"Usage:\0A\09%s [options...] hostname port\0A\09%s -l -p port [-s addr] [options...] [hostname] [port]\0A\0ARecognized options are:\0A\00"
@.str.1 = [28 x i8] c" -4, --ipv4 %s\0A\00"
@.str.2 = [14 x i8] c"Use only IPv4\00"
@.str.3 = [28 x i8] c" -6, --ipv6 %s\0A\00"
@.str.4 = [14 x i8] c"Use only IPv6\00"
@.str.5 = [28 x i8] c" -a, --any-protocol %s\0A\00"
@.str.6 = [44 x i8] c"Use any available protocol (default is TCP)\00"
@.str.7 = [28 x i8] c" -b, --bluetooth %s\0A\00"
@.str.8 = [43 x i8] c"Use Bluetooth (defaults to L2CAP protocol)\00"
@.str.9 = [28 x i8] c" --buffer-size=BYTES %s\0A\00"
@.str.10 = [16 x i8] c"Set buffer size\00"
@.str.11 = [28 x i8] c" --continuous %s\0A\00"
@.str.12 = [90 x i8] c"Continuously accept connections\0A (only in listen mode with --exec)\00"
@.str.13 = [28 x i8] c" --disable-nagle %s\0A\00"
@.str.14 = [44 x i8] c"Disable nagle algorithm for TCP connections\00"
@.str.15 = [28 x i8] c" -e, --exec=CMD %s\0A\00"
@.str.16 = [27 x i8] c"Exec command after connect\00"
@.str.17 = [28 x i8] c" --half-close %s\0A\00"
@.str.18 = [37 x i8] c"Handle network half-closes correctly\00"
@.str.19 = [28 x i8] c" -h, --help %s\0A\00"
@.str.20 = [13 x i8] c"Display help\00"
@.str.21 = [28 x i8] c" -l, --listen %s\0A\00"
@.str.22 = [34 x i8] c"Listen mode, for inbound connects\00"
@.str.23 = [28 x i8] c" --mtu=BYTES %s\0A\00"
@.str.24 = [41 x i8] c"Set MTU for network connection transmits\00"
@.str.25 = [28 x i8] c" -n %s\0A\00"
@.str.26 = [34 x i8] c"Numeric-only IP addresses, no DNS\00"
@.str.27 = [28 x i8] c" --no-reuseaddr %s\0A\00"
@.str.28 = [81 x i8] c"Disable SO_REUSEADDR socket option\0A (only in listen mode)\00"
@.str.29 = [28 x i8] c" --nru=BYTES %s\0A\00"
@.str.30 = [40 x i8] c"Set NRU for network connection receives\00"
@.str.31 = [28 x i8] c" -p, --port=PORT %s\0A\00"
@.str.32 = [11 x i8] c"Local port\00"
@.str.33 = [60 x i8] c" -q, --hold-timeout=SEC1[:SEC2]\0A %s\0A\00"
@.str.34 = [43 x i8] c"Set hold timeout(s) for local [and remote]\00"
@.str.35 = [28 x i8] c" --rcvbuf-size %s\0A\00"
@.str.36 = [47 x i8] c"Kernel receive buffer size for network sockets\00"
@.str.37 = [28 x i8] c" --recv-only %s\0A\00"
@.str.38 = [34 x i8] c"Only receive data, don't transmit\00"
@.str.39 = [28 x i8] c" -s, --address=ADDRESS %s\0A\00"
@.str.40 = [21 x i8] c"Local source address\00"
@.str.41 = [28 x i8] c" --sco %s\0A\00"
@.str.42 = [32 x i8] c"Use SCO protocol over Bluetooth\00"
@.str.43 = [28 x i8] c" --send-only %s\0A\00"
@.str.44 = [34 x i8] c"Only transmit data, don't receive\00"
@.str.45 = [28 x i8] c" --sndbuf-size %s\0A\00"
@.str.46 = [44 x i8] c"Kernel send buffer size for network sockets\00"
@.str.47 = [64 x i8] c" --socktype=[stream|dgram|seqpacket] %s\0A\00"
@.str.48 = [39 x i8] c"Socket type to use. Default is stream.\00"
@.str.49 = [56 x i8] c" -t, --idle-timeout=SECONDS\0A %s\0A\00"
@.str.50 = [24 x i8] c"Idle connection timeout\00"
@.str.51 = [28 x i8] c" -u, --udp %s\0A\00"
@.str.52 = [41 x i8] c"Require use of UDP protocol (implies -d)\00"
@.str.53 = [28 x i8] c" -v, --verbose %s\0A\00"
@.str.54 = [82 x i8] c"Increase program verbosity\0A (call twice for max verbosity)\00"
@.str.55 = [28 x i8] c" --version %s\0A\00"
@.str.56 = [32 x i8] c"Display nc6 version information\00"
@.str.57 = [28 x i8] c" -w, --timeout=SECONDS %s\0A\00"
@.str.58 = [29 x i8] c"Timeout for connects/accepts\00"
@.str.59 = [28 x i8] c" -x, --transfer %s\0A\00"
@.str.60 = [19 x i8] c"File transfer mode\00"
@.str.61 = [28 x i8] c" -X, --rev-transfer %s\0A\00"
@.str.62 = [39 x i8] c"File transfer mode (reverse direction)\00"
@.str.63 = [2 x i8] c"\0A\00"
define void @print_usage(i32* %0) {
%2 = alloca i32*
%3 = alloca i8*
store i32* %0, i32** %2
%4 = call i8* (...) @get_program_name()
store i8* %4, i8** %3
%5 = load i32*, i32** %2
%6 = icmp ne i32* %5, null
%7 = zext i1 %6 to i32
%8 = call i32 @assert(i32 %7)
%9 = load i8*, i8** %3
%10 = icmp ne i8* %9, null
%11 = zext i1 %10 to i32
%12 = call i32 @assert(i32 %11)
%13 = load i32*, i32** %2
%14 = load i8*, i8** %3
%15 = load i8*, i8** %3
%16 = call i32 (i32*, i8*, ...) @fprintf(i32* %13, i8* getelementptr inbounds ([120 x i8], [120 x i8]* @.str, i64 0, i64 0), i8* %14, i8* %15)
%17 = load i32*, i32** %2
%18 = call i32 (i32*, i8*, ...) @fprintf(i32* %17, i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.1, i64 0, i64 0), i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.2, i64 0, i64 0))
%19 = load i32*, i32** %2
%20 = call i32 (i32*, i8*, ...) @fprintf(i32* %19, i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.3, i64 0, i64 0), i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.4, i64 0, i64 0))
%21 = load i32*, i32** %2
%22 = call i32 (i32*, i8*, ...) @fprintf(i32* %21, i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.5, i64 0, i64 0), i8* getelementptr inbounds ([44 x i8], [44 x i8]* @.str.6, i64 0, i64 0))
%23 = load i32*, i32** %2
%24 = call i32 (i32*, i8*, ...) @fprintf(i32* %23, i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.7, i64 0, i64 0), i8* getelementptr inbounds ([43 x i8], [43 x i8]* @.str.8, i64 0, i64 0))
%25 = load i32*, i32** %2
%26 = call i32 (i32*, i8*, ...) @fprintf(i32* %25, i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.9, i64 0, i64 0), i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.10, i64 0, i64 0))
%27 = load i32*, i32** %2
%28 = call i32 (i32*, i8*, ...) @fprintf(i32* %27, i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.11, i64 0, i64 0), i8* getelementptr inbounds ([90 x i8], [90 x i8]* @.str.12, i64 0, i64 0))
%29 = load i32*, i32** %2
%30 = call i32 (i32*, i8*, ...) @fprintf(i32* %29, i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.13, i64 0, i64 0), i8* getelementptr inbounds ([44 x i8], [44 x i8]* @.str.14, i64 0, i64 0))
%31 = load i32*, i32** %2
%32 = call i32 (i32*, i8*, ...) @fprintf(i32* %31, i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.15, i64 0, i64 0), i8* getelementptr inbounds ([27 x i8], [27 x i8]* @.str.16, i64 0, i64 0))
%33 = load i32*, i32** %2
%34 = call i32 (i32*, i8*, ...) @fprintf(i32* %33, i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.17, i64 0, i64 0), i8* getelementptr inbounds ([37 x i8], [37 x i8]* @.str.18, i64 0, i64 0))
%35 = load i32*, i32** %2
%36 = call i32 (i32*, i8*, ...) @fprintf(i32* %35, i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.19, i64 0, i64 0), i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.20, i64 0, i64 0))
%37 = load i32*, i32** %2
%38 = call i32 (i32*, i8*, ...) @fprintf(i32* %37, i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.21, i64 0, i64 0), i8* getelementptr inbounds ([34 x i8], [34 x i8]* @.str.22, i64 0, i64 0))
%39 = load i32*, i32** %2
%40 = call i32 (i32*, i8*, ...) @fprintf(i32* %39, i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.23, i64 0, i64 0), i8* getelementptr inbounds ([41 x i8], [41 x i8]* @.str.24, i64 0, i64 0))
%41 = load i32*, i32** %2
%42 = call i32 (i32*, i8*, ...) @fprintf(i32* %41, i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.25, i64 0, i64 0), i8* getelementptr inbounds ([34 x i8], [34 x i8]* @.str.26, i64 0, i64 0))
%43 = load i32*, i32** %2
%44 = call i32 (i32*, i8*, ...) @fprintf(i32* %43, i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.27, i64 0, i64 0), i8* getelementptr inbounds ([81 x i8], [81 x i8]* @.str.28, i64 0, i64 0))
%45 = load i32*, i32** %2
%46 = call i32 (i32*, i8*, ...) @fprintf(i32* %45, i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.29, i64 0, i64 0), i8* getelementptr inbounds ([40 x i8], [40 x i8]* @.str.30, i64 0, i64 0))
%47 = load i32*, i32** %2
%48 = call i32 (i32*, i8*, ...) @fprintf(i32* %47, i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.31, i64 0, i64 0), i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.32, i64 0, i64 0))
%49 = load i32*, i32** %2
%50 = call i32 (i32*, i8*, ...) @fprintf(i32* %49, i8* getelementptr inbounds ([60 x i8], [60 x i8]* @.str.33, i64 0, i64 0), i8* getelementptr inbounds ([43 x i8], [43 x i8]* @.str.34, i64 0, i64 0))
%51 = load i32*, i32** %2
%52 = call i32 (i32*, i8*, ...) @fprintf(i32* %51, i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.35, i64 0, i64 0), i8* getelementptr inbounds ([47 x i8], [47 x i8]* @.str.36, i64 0, i64 0))
%53 = load i32*, i32** %2
%54 = call i32 (i32*, i8*, ...) @fprintf(i32* %53, i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.37, i64 0, i64 0), i8* getelementptr inbounds ([34 x i8], [34 x i8]* @.str.38, i64 0, i64 0))
%55 = load i32*, i32** %2
%56 = call i32 (i32*, i8*, ...) @fprintf(i32* %55, i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.39, i64 0, i64 0), i8* getelementptr inbounds ([21 x i8], [21 x i8]* @.str.40, i64 0, i64 0))
%57 = load i32*, i32** %2
%58 = call i32 (i32*, i8*, ...) @fprintf(i32* %57, i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.41, i64 0, i64 0), i8* getelementptr inbounds ([32 x i8], [32 x i8]* @.str.42, i64 0, i64 0))
%59 = load i32*, i32** %2
%60 = call i32 (i32*, i8*, ...) @fprintf(i32* %59, i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.43, i64 0, i64 0), i8* getelementptr inbounds ([34 x i8], [34 x i8]* @.str.44, i64 0, i64 0))
%61 = load i32*, i32** %2
%62 = call i32 (i32*, i8*, ...) @fprintf(i32* %61, i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.45, i64 0, i64 0), i8* getelementptr inbounds ([44 x i8], [44 x i8]* @.str.46, i64 0, i64 0))
%63 = load i32*, i32** %2
%64 = call i32 (i32*, i8*, ...) @fprintf(i32* %63, i8* getelementptr inbounds ([64 x i8], [64 x i8]* @.str.47, i64 0, i64 0), i8* getelementptr inbounds ([39 x i8], [39 x i8]* @.str.48, i64 0, i64 0))
%65 = load i32*, i32** %2
%66 = call i32 (i32*, i8*, ...) @fprintf(i32* %65, i8* getelementptr inbounds ([56 x i8], [56 x i8]* @.str.49, i64 0, i64 0), i8* getelementptr inbounds ([24 x i8], [24 x i8]* @.str.50, i64 0, i64 0))
%67 = load i32*, i32** %2
%68 = call i32 (i32*, i8*, ...) @fprintf(i32* %67, i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.51, i64 0, i64 0), i8* getelementptr inbounds ([41 x i8], [41 x i8]* @.str.52, i64 0, i64 0))
%69 = load i32*, i32** %2
%70 = call i32 (i32*, i8*, ...) @fprintf(i32* %69, i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.53, i64 0, i64 0), i8* getelementptr inbounds ([82 x i8], [82 x i8]* @.str.54, i64 0, i64 0))
%71 = load i32*, i32** %2
%72 = call i32 (i32*, i8*, ...) @fprintf(i32* %71, i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.55, i64 0, i64 0), i8* getelementptr inbounds ([32 x i8], [32 x i8]* @.str.56, i64 0, i64 0))
%73 = load i32*, i32** %2
%74 = call i32 (i32*, i8*, ...) @fprintf(i32* %73, i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.57, i64 0, i64 0), i8* getelementptr inbounds ([29 x i8], [29 x i8]* @.str.58, i64 0, i64 0))
%75 = load i32*, i32** %2
%76 = call i32 (i32*, i8*, ...) @fprintf(i32* %75, i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.59, i64 0, i64 0), i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str.60, i64 0, i64 0))
%77 = load i32*, i32** %2
%78 = call i32 (i32*, i8*, ...) @fprintf(i32* %77, i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.61, i64 0, i64 0), i8* getelementptr inbounds ([39 x i8], [39 x i8]* @.str.62, i64 0, i64 0))
%79 = load i32*, i32** %2
%80 = call i32 (i32*, i8*, ...) @fprintf(i32* %79, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.63, i64 0, i64 0))
ret void
}

LLVM IR (-O2):
@.str = [120 x i8] c"Usage:\0A\09%s [options...] hostname port\0A\09%s -l -p port [-s addr] [options...] [hostname] [port]\0A\0ARecognized options are:\0A\00"
@.str.1 = [28 x i8] c" -4, --ipv4 %s\0A\00"
@.str.2 = [14 x i8] c"Use only IPv4\00"
@.str.3 = [28 x i8] c" -6, --ipv6 %s\0A\00"
@.str.4 = [14 x i8] c"Use only IPv6\00"
@.str.5 = [28 x i8] c" -a, --any-protocol %s\0A\00"
@.str.6 = [44 x i8] c"Use any available protocol (default is TCP)\00"
@.str.7 = [28 x i8] c" -b, --bluetooth %s\0A\00"
@.str.8 = [43 x i8] c"Use Bluetooth (defaults to L2CAP protocol)\00"
@.str.9 = [28 x i8] c" --buffer-size=BYTES %s\0A\00"
@.str.10 = [16 x i8] c"Set buffer size\00"
@.str.11 = [28 x i8] c" --continuous %s\0A\00"
@.str.12 = [90 x i8] c"Continuously accept connections\0A (only in listen mode with --exec)\00"
@.str.13 = [28 x i8] c" --disable-nagle %s\0A\00"
@.str.14 = [44 x i8] c"Disable nagle algorithm for TCP connections\00"
@.str.15 = [28 x i8] c" -e, --exec=CMD %s\0A\00"
@.str.16 = [27 x i8] c"Exec command after connect\00"
@.str.17 = [28 x i8] c" --half-close %s\0A\00"
@.str.18 = [37 x i8] c"Handle network half-closes correctly\00"
@.str.19 = [28 x i8] c" -h, --help %s\0A\00"
@.str.20 = [13 x i8] c"Display help\00"
@.str.21 = [28 x i8] c" -l, --listen %s\0A\00"
@.str.22 = [34 x i8] c"Listen mode, for inbound connects\00"
@.str.23 = [28 x i8] c" --mtu=BYTES %s\0A\00"
@.str.24 = [41 x i8] c"Set MTU for network connection transmits\00"
@.str.25 = [28 x i8] c" -n %s\0A\00"
@.str.26 = [34 x i8] c"Numeric-only IP addresses, no DNS\00"
@.str.27 = [28 x i8] c" --no-reuseaddr %s\0A\00"
@.str.28 = [81 x i8] c"Disable SO_REUSEADDR socket option\0A (only in listen mode)\00"
@.str.29 = [28 x i8] c" --nru=BYTES %s\0A\00"
@.str.30 = [40 x i8] c"Set NRU for network connection receives\00"
@.str.31 = [28 x i8] c" -p, --port=PORT %s\0A\00"
@.str.32 = [11 x i8] c"Local port\00"
@.str.33 = [60 x i8] c" -q, --hold-timeout=SEC1[:SEC2]\0A %s\0A\00"
@.str.34 = [43 x i8] c"Set hold timeout(s) for local [and remote]\00"
@.str.35 = [28 x i8] c" --rcvbuf-size %s\0A\00"
@.str.36 = [47 x i8] c"Kernel receive buffer size for network sockets\00"
@.str.37 = [28 x i8] c" --recv-only %s\0A\00"
@.str.38 = [34 x i8] c"Only receive data, don't transmit\00"
@.str.39 = [28 x i8] c" -s, --address=ADDRESS %s\0A\00"
@.str.40 = [21 x i8] c"Local source address\00"
@.str.41 = [28 x i8] c" --sco %s\0A\00"
@.str.42 = [32 x i8] c"Use SCO protocol over Bluetooth\00"
@.str.43 = [28 x i8] c" --send-only %s\0A\00"
@.str.44 = [34 x i8] c"Only transmit data, don't receive\00"
@.str.45 = [28 x i8] c" --sndbuf-size %s\0A\00"
@.str.46 = [44 x i8] c"Kernel send buffer size for network sockets\00"
@.str.47 = [64 x i8] c" --socktype=[stream|dgram|seqpacket] %s\0A\00"
@.str.48 = [39 x i8] c"Socket type to use. Default is stream.\00"
@.str.49 = [56 x i8] c" -t, --idle-timeout=SECONDS\0A %s\0A\00"
@.str.50 = [24 x i8] c"Idle connection timeout\00"
@.str.51 = [28 x i8] c" -u, --udp %s\0A\00"
@.str.52 = [41 x i8] c"Require use of UDP protocol (implies -d)\00"
@.str.53 = [28 x i8] c" -v, --verbose %s\0A\00"
@.str.54 = [82 x i8] c"Increase program verbosity\0A (call twice for max verbosity)\00"
@.str.55 = [28 x i8] c" --version %s\0A\00"
@.str.56 = [32 x i8] c"Display nc6 version information\00"
@.str.57 = [28 x i8] c" -w, --timeout=SECONDS %s\0A\00"
@.str.58 = [29 x i8] c"Timeout for connects/accepts\00"
@.str.59 = [28 x i8] c" -x, --transfer %s\0A\00"
@.str.60 = [19 x i8] c"File transfer mode\00"
@.str.61 = [28 x i8] c" -X, --rev-transfer %s\0A\00"
@.str.62 = [39 x i8] c"File transfer mode (reverse direction)\00"
define void @print_usage(i32* %0) {
%2 = tail call i8* (...) @get_program_name()
%3 = icmp ne i32* %0, null
%4 = zext i1 %3 to i32
%5 = tail call i32 @assert(i32 %4)
%6 = icmp ne i8* %2, null
%7 = zext i1 %6 to i32
%8 = tail call i32 @assert(i32 %7)
%9 = tail call i32 (i32*, i8*, ...) @fprintf(i32* %0, i8* getelementptr inbounds ([120 x i8], [120 x i8]* @.str, i64 0, i64 0), i8* %2, i8* %2)
%10 = tail call i32 (i32*, i8*, ...) @fprintf(i32* %0, i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.1, i64 0, i64 0), i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.2, i64 0, i64 0))
%11 = tail call i32 (i32*, i8*, ...) @fprintf(i32* %0, i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.3, i64 0, i64 0), i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.4, i64 0, i64 0))
%12 = tail call i32 (i32*, i8*, ...) @fprintf(i32* %0, i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.5, i64 0, i64 0), i8* getelementptr inbounds ([44 x i8], [44 x i8]* @.str.6, i64 0, i64 0))
%13 = tail call i32 (i32*, i8*, ...) @fprintf(i32* %0, i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.7, i64 0, i64 0), i8* getelementptr inbounds ([43 x i8], [43 x i8]* @.str.8, i64 0, i64 0))
%14 = tail call i32 (i32*, i8*, ...) @fprintf(i32* %0, i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.9, i64 0, i64 0), i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.10, i64 0, i64 0))
%15 = tail call i32 (i32*, i8*, ...) @fprintf(i32* %0, i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.11, i64 0, i64 0), i8* getelementptr inbounds ([90 x i8], [90 x i8]* @.str.12, i64 0, i64 0))
%16 = tail call i32 (i32*, i8*, ...) @fprintf(i32* %0, i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.13, i64 0, i64 0), i8* getelementptr inbounds ([44 x i8], [44 x i8]* @.str.14, i64 0, i64 0))
%17 = tail call i32 (i32*, i8*, ...) @fprintf(i32* %0, i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.15, i64 0, i64 0), i8* getelementptr inbounds ([27 x i8], [27 x i8]* @.str.16, i64 0, i64 0))
%18 = tail call i32 (i32*, i8*, ...) @fprintf(i32* %0, i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.17, i64 0, i64 0), i8* getelementptr inbounds ([37 x i8], [37 x i8]* @.str.18, i64 0, i64 0))
%19 = tail call i32 (i32*, i8*, ...) @fprintf(i32* %0, i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.19, i64 0, i64 0), i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.20, i64 0, i64 0))
%20 = tail call i32 (i32*, i8*, ...) @fprintf(i32* %0, i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.21, i64 0, i64 0), i8* getelementptr inbounds ([34 x i8], [34 x i8]* @.str.22, i64 0, i64 0))
%21 = tail call i32 (i32*, i8*, ...) @fprintf(i32* %0, i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.23, i64 0, i64 0), i8* getelementptr inbounds ([41 x i8], [41 x i8]* @.str.24, i64 0, i64 0))
%22 = tail call i32 (i32*, i8*, ...) @fprintf(i32* %0, i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.25, i64 0, i64 0), i8* getelementptr inbounds ([34 x i8], [34 x i8]* @.str.26, i64 0, i64 0))
%23 = tail call i32 (i32*, i8*, ...) @fprintf(i32* %0, i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.27, i64 0, i64 0), i8* getelementptr inbounds ([81 x i8], [81 x i8]* @.str.28, i64 0, i64 0))
%24 = tail call i32 (i32*, i8*, ...) @fprintf(i32* %0, i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.29, i64 0, i64 0), i8* getelementptr inbounds ([40 x i8], [40 x i8]* @.str.30, i64 0, i64 0))
%25 = tail call i32 (i32*, i8*, ...) @fprintf(i32* %0, i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.31, i64 0, i64 0), i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.32, i64 0, i64 0))
%26 = tail call i32 (i32*, i8*, ...) @fprintf(i32* %0, i8* getelementptr inbounds ([60 x i8], [60 x i8]* @.str.33, i64 0, i64 0), i8* getelementptr inbounds ([43 x i8], [43 x i8]* @.str.34, i64 0, i64 0))
%27 = tail call i32 (i32*, i8*, ...) @fprintf(i32* %0, i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.35, i64 0, i64 0), i8* getelementptr inbounds ([47 x i8], [47 x i8]* @.str.36, i64 0, i64 0))
%28 = tail call i32 (i32*, i8*, ...) @fprintf(i32* %0, i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.37, i64 0, i64 0), i8* getelementptr inbounds ([34 x i8], [34 x i8]* @.str.38, i64 0, i64 0))
%29 = tail call i32 (i32*, i8*, ...) @fprintf(i32* %0, i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.39, i64 0, i64 0), i8* getelementptr inbounds ([21 x i8], [21 x i8]* @.str.40, i64 0, i64 0))
%30 = tail call i32 (i32*, i8*, ...) @fprintf(i32* %0, i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.41, i64 0, i64 0), i8* getelementptr inbounds ([32 x i8], [32 x i8]* @.str.42, i64 0, i64 0))
%31 = tail call i32 (i32*, i8*, ...) @fprintf(i32* %0, i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.43, i64 0, i64 0), i8* getelementptr inbounds ([34 x i8], [34 x i8]* @.str.44, i64 0, i64 0))
%32 = tail call i32 (i32*, i8*, ...) @fprintf(i32* %0, i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.45, i64 0, i64 0), i8* getelementptr inbounds ([44 x i8], [44 x i8]* @.str.46, i64 0, i64 0))
%33 = tail call i32 (i32*, i8*, ...) @fprintf(i32* %0, i8* getelementptr inbounds ([64 x i8], [64 x i8]* @.str.47, i64 0, i64 0), i8* getelementptr inbounds ([39 x i8], [39 x i8]* @.str.48, i64 0, i64 0))
%34 = tail call i32 (i32*, i8*, ...) @fprintf(i32* %0, i8* getelementptr inbounds ([56 x i8], [56 x i8]* @.str.49, i64 0, i64 0), i8* getelementptr inbounds ([24 x i8], [24 x i8]* @.str.50, i64 0, i64 0))
%35 = tail call i32 (i32*, i8*, ...) @fprintf(i32* %0, i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.51, i64 0, i64 0), i8* getelementptr inbounds ([41 x i8], [41 x i8]* @.str.52, i64 0, i64 0))
%36 = tail call i32 (i32*, i8*, ...) @fprintf(i32* %0, i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.53, i64 0, i64 0), i8* getelementptr inbounds ([82 x i8], [82 x i8]* @.str.54, i64 0, i64 0))
%37 = tail call i32 (i32*, i8*, ...) @fprintf(i32* %0, i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.55, i64 0, i64 0), i8* getelementptr inbounds ([32 x i8], [32 x i8]* @.str.56, i64 0, i64 0))
%38 = tail call i32 (i32*, i8*, ...) @fprintf(i32* %0, i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.57, i64 0, i64 0), i8* getelementptr inbounds ([29 x i8], [29 x i8]* @.str.58, i64 0, i64 0))
%39 = tail call i32 (i32*, i8*, ...) @fprintf(i32* %0, i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.59, i64 0, i64 0), i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str.60, i64 0, i64 0))
%40 = tail call i32 (i32*, i8*, ...) @fprintf(i32* %0, i8* getelementptr inbounds ([28 x i8], [28 x i8]* @.str.61, i64 0, i64 0), i8* getelementptr inbounds ([39 x i8], [39 x i8]* @.str.62, i64 0, i64 0))
%41 = tail call i32 @fputc(i32 10, i32* %0)
ret void
}