#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*/ printf(char *, ...);
void print_usage(void) {
  printf("pcap_latency_analyzer: <pcap A> <pcap B>\n");
  printf("\n");
  printf("Version: %s %s\n", "Mar 18 2022", "04:05:59");
  printf("Contact: support at fmad.io\n");
  printf("\n");
  printf("Options:\n");
  printf(" --packet-trace                  | write each packet events to "
         "stdout\n");
  printf(" --length-histo                  | print packet length histogram\n");
  printf(" --latency-histo                 | print latency histogram \n");
  printf(" --hash-memory                   | (int MB) amount of memory to use "
         "for hashing. default 128MB\n");
  printf(" --disable-mmap                  | use fread not mmap of the pcap "
         "files\n");
  printf(" --packet-time-delta-max         | reset time between new and old "
         "packets with the same hash.\n");
  printf(" --packet-max <number>           | maximum number of packets to "
         "process\n");
  printf("\n");
  printf(" --tcp-length <number>           | filter tcp packets to include "
         "only payload length of <number>\n");
  printf(" --tcp-length-chomp <number>     | set max tcp payload hash to be of "
         "length <number>. for packet slicing\n");
  printf(" --tcp-only                      | only match tcp packets\n");
  printf(" --udp-only                      | only match udp packets\n");
  printf(" --udp-length <number>           | specifiy udp packets of only "
         "length <number>\n");
  printf(" --udp-length-chomp <number>     | remove <number> bytes from the "
         "end of the UDP packet\n");
  printf("\n");
  printf("Hash the entire packet\n");
  printf(" --full-packet                   | use entire packet contents for "
         "hash (.e.g no protocol)\n");
  printf(" --full-packet-tcp-only          | use entire packet contents for "
         "hash but only for tcp packets\n");
  printf(" --full-packet-udp-only          | use entire packet contents for "
         "hash but only for udp packets\n");
  printf("\n");
  printf("Diff 2 PCAP files:");
  printf(" --file-diff                     | special mode of comparing packets "
         "between 2 files (instead of within the same file)\n");
  printf(" --file-diff                     | special mode of comparing packets "
         "between 2 files (instead of within the same file)\n");
  printf(" --file-diff-no-timesync         | do not attempt to time sync the "
         "two files. reads 1MB chunks at a time\n");
  printf(" --file-diff-strict              | only matches with two entries in "
         "a hash node will be sampled\n");
  printf(" --file-diff-nofcs-a             | file A has no FCS (ethernet crc) "
         "value\n");
  printf(" --file-diff-nofcs-b             | file B has no FCS (ethernet crc) "
         "value\n");
  printf(" --file-diff-missing-trace       | trace all packets that are "
         "missing\n");
  printf(" --file-diff-latency-trace <number in ns> | trace packets that have "
         "latency greather than <number>\n");
  printf("\n");
  printf("Diff 2 MAC address:\n");
  printf(" --mac-diff                      | compare packets from 2 mac "
         "address in a single PCAP\n");
  printf(" --mac-diff-a 00:11:22:33:44:55  | specify MAC address A\n");
  printf(" --mac-diff-b 66:77:88:99:aa:bb  | specify MAC address B\n");
  printf("\n");
  printf("Latency histogram shaping\n");
  printf(" --latency-histo-min             | minimum time delta for histogram. "
         "default -1e6 ns\n");
  printf(" --latency-histo-max             | maximum time delta for histogram. "
         "default 1e6 ns\n");
  printf(" --latency-histo-unit            | duration of a single histogram "
         "slot. default 100ns\n");
  printf("\n");
  printf(" --ts-last-byte-a                | adjust timestamp of first file A "
         "from last byte to first byte (assumes 10G)\n");
  printf(" --ts-last-byte-b                | adjust timestamp of first file B "
         "from last byte to first byte (assumes 10G)\n");
  printf("\n");
}


x86 assembly (clang, -O0):
<print_usage>:
push   %rbp
mov    %rsp,%rbp
lea    0xee5(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0x1011(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0xef3(%rip),%rdi
lea    0xefc(%rip),%rsi
lea    0xf01(%rip),%rdx
mov    $0x0,%al
call   1030 <printf@plt>
lea    0xefc(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0xfd9(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0xefd(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0xef9(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0xf32(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0xf66(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0xf95(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0xfe7(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0x1022(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0x1073(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0xf5b(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0x10a0(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0x10f4(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0x1150(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0x117d(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0x11aa(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0x11ed(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0xef9(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0x122a(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0x1234(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0x1281(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0x12d4(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0xeb3(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0x1319(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0x131e(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0x1310(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0x137a(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0x13d6(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0x1429(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0x1466(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0x14a3(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0x14dc(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0xe27(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0x1524(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0x152b(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0x1575(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0x15a1(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0xde1(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0x15bf(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0x15cc(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0x1614(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0x165b(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0xd9b(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0x1696(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0x16f8(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0xd71(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
pop    %rbp
ret

x86 assembly (clang, -O2):
<print_usage>:
push   %rbx
lea    0xf00(%rip),%rdi
call   1040 <puts@plt>
mov    $0xa,%edi
call   1030 <putchar@plt>
lea    0xeb2(%rip),%rdi
lea    0xebb(%rip),%rsi
lea    0xec0(%rip),%rdx
xor    %eax,%eax
call   1050 <printf@plt>
lea    0xef7(%rip),%rdi
call   1040 <puts@plt>
mov    $0xa,%edi
call   1030 <putchar@plt>
lea    0xefd(%rip),%rdi
call   1040 <puts@plt>
lea    0xefa(%rip),%rdi
call   1040 <puts@plt>
lea    0xf34(%rip),%rdi
call   1040 <puts@plt>
lea    0xf69(%rip),%rdi
call   1040 <puts@plt>
lea    0xf99(%rip),%rdi
call   1040 <puts@plt>
lea    0xfec(%rip),%rdi
call   1040 <puts@plt>
lea    0x1028(%rip),%rdi
call   1040 <puts@plt>
lea    0x107a(%rip),%rdi
call   1040 <puts@plt>
mov    $0xa,%edi
call   1030 <putchar@plt>
lea    0x10ac(%rip),%rdi
call   1040 <puts@plt>
lea    0x1101(%rip),%rdi
call   1040 <puts@plt>
lea    0x115e(%rip),%rdi
call   1040 <puts@plt>
lea    0x118c(%rip),%rdi
call   1040 <puts@plt>
lea    0x11ba(%rip),%rdi
call   1040 <puts@plt>
lea    0x11fe(%rip),%rdi
call   1040 <puts@plt>
mov    $0xa,%edi
call   1030 <putchar@plt>
lea    0x1240(%rip),%rdi
call   1040 <puts@plt>
lea    0x124b(%rip),%rdi
call   1040 <puts@plt>
lea    0x1299(%rip),%rdi
call   1040 <puts@plt>
lea    0x12ed(%rip),%rdi
call   1040 <puts@plt>
mov    $0xa,%edi
call   1030 <putchar@plt>
lea    0xdaf(%rip),%rdi
xor    %eax,%eax
call   1050 <printf@plt>
lea    0x1329(%rip),%rbx
mov    %rbx,%rdi
call   1040 <puts@plt>
mov    %rbx,%rdi
call   1040 <puts@plt>
lea    0x1389(%rip),%rdi
call   1040 <puts@plt>
lea    0x13e6(%rip),%rdi
call   1040 <puts@plt>
lea    0x143a(%rip),%rdi
call   1040 <puts@plt>
lea    0x1478(%rip),%rdi
call   1040 <puts@plt>
lea    0x14b6(%rip),%rdi
call   1040 <puts@plt>
lea    0x14f0(%rip),%rdi
call   1040 <puts@plt>
mov    $0xa,%edi
call   1030 <putchar@plt>
lea    0x153d(%rip),%rdi
call   1040 <puts@plt>
lea    0x1545(%rip),%rdi
call   1040 <puts@plt>
lea    0x1590(%rip),%rdi
call   1040 <puts@plt>
lea    0x15bd(%rip),%rdi
call   1040 <puts@plt>
mov    $0xa,%edi
call   1030 <putchar@plt>
lea    0x15e0(%rip),%rdi
call   1040 <puts@plt>
lea    0x15ee(%rip),%rdi
call   1040 <puts@plt>
lea    0x1637(%rip),%rdi
call   1040 <puts@plt>
lea    0x167f(%rip),%rdi
call   1040 <puts@plt>
mov    $0xa,%edi
call   1030 <putchar@plt>
lea    0x16bf(%rip),%rdi
call   1040 <puts@plt>
lea    0x1722(%rip),%rdi
call   1040 <puts@plt>
mov    $0xa,%edi
pop    %rbx
jmp    1030 <putchar@plt>

LLVM IR (-O0):
@.str = [42 x i8] c"pcap_latency_analyzer: <pcap A> <pcap B>\0A\00"
@.str.1 = [2 x i8] c"\0A\00"
@.str.2 = [16 x i8] c"Version: %s %s\0A\00"
@.str.3 = [12 x i8] c"Mar 18 2022\00"
@.str.4 = [9 x i8] c"04:05:59\00"
@.str.5 = [29 x i8] c"Contact: support at fmad.io\0A\00"
@.str.6 = [10 x i8] c"Options:\0A\00"
@.str.7 = [71 x i8] c" --packet-trace | write each packet events to stdout\0A\00"
@.str.8 = [66 x i8] c" --length-histo | print packet length histogram\0A\00"
@.str.9 = [61 x i8] c" --latency-histo | print latency histogram \0A\00"
@.str.10 = [96 x i8] c" --hash-memory | (int MB) amount of memory to use for hashing. default 128MB\0A\00"
@.str.11 = [73 x i8] c" --disable-mmap | use fread not mmap of the pcap files\0A\00"
@.str.12 = [95 x i8] c" --packet-time-delta-max | reset time between new and old packets with the same hash.\0A\00"
@.str.13 = [73 x i8] c" --packet-max <number> | maximum number of packets to process\0A\00"
@.str.14 = [98 x i8] c" --tcp-length <number> | filter tcp packets to include only payload length of <number>\0A\00"
@.str.15 = [106 x i8] c" --tcp-length-chomp <number> | set max tcp payload hash to be of length <number>. for packet slicing\0A\00"
@.str.16 = [59 x i8] c" --tcp-only | only match tcp packets\0A\00"
@.str.17 = [59 x i8] c" --udp-only | only match udp packets\0A\00"
@.str.18 = [81 x i8] c" --udp-length <number> | specifiy udp packets of only length <number>\0A\00"
@.str.19 = [89 x i8] c" --udp-length-chomp <number> | remove <number> bytes from the end of the UDP packet\0A\00"
@.str.20 = [24 x i8] c"Hash the entire packet\0A\00"
@.str.21 = [91 x i8] c" --full-packet | use entire packet contents for hash (.e.g no protocol)\0A\00"
@.str.22 = [97 x i8] c" --full-packet-tcp-only | use entire packet contents for hash but only for tcp packets\0A\00"
@.str.23 = [97 x i8] c" --full-packet-udp-only | use entire packet contents for hash but only for udp packets\0A\00"
@.str.24 = [19 x i8] c"Diff 2 PCAP files:\00"
@.str.25 = [120 x i8] c" --file-diff | special mode of comparing packets between 2 files (instead of within the same file)\0A\00"
@.str.26 = [106 x i8] c" --file-diff-no-timesync | do not attempt to time sync the two files. reads 1MB chunks at a time\0A\00"
@.str.27 = [97 x i8] c" --file-diff-strict | only matches with two entries in a hash node will be sampled\0A\00"
@.str.28 = [75 x i8] c" --file-diff-nofcs-a | file A has no FCS (ethernet crc) value\0A\00"
@.str.29 = [75 x i8] c" --file-diff-nofcs-b | file B has no FCS (ethernet crc) value\0A\00"
@.str.30 = [71 x i8] c" --file-diff-missing-trace | trace all packets that are missing\0A\00"
@.str.31 = [100 x i8] c" --file-diff-latency-trace <number in ns> | trace packets that have latency greather than <number>\0A\00"
@.str.32 = [21 x i8] c"Diff 2 MAC address:\0A\00"
@.str.33 = [88 x i8] c" --mac-diff | compare packets from 2 mac address in a single PCAP\0A\00"
@.str.34 = [58 x i8] c" --mac-diff-a 00:11:22:33:44:55 | specify MAC address A\0A\00"
@.str.35 = [58 x i8] c" --mac-diff-b 66:77:88:99:aa:bb | specify MAC address B\0A\00"
@.str.36 = [27 x i8] c"Latency histogram shaping\0A\00"
@.str.37 = [86 x i8] c" --latency-histo-min | minimum time delta for histogram. default -1e6 ns\0A\00"
@.str.38 = [85 x i8] c" --latency-histo-max | maximum time delta for histogram. default 1e6 ns\0A\00"
@.str.39 = [87 x i8] c" --latency-histo-unit | duration of a single histogram slot. default 100ns\0A\00"
@.str.40 = [112 x i8] c" --ts-last-byte-a | adjust timestamp of first file A from last byte to first byte (assumes 10G)\0A\00"
@.str.41 = [112 x i8] c" --ts-last-byte-b | adjust timestamp of first file B from last byte to first byte (assumes 10G)\0A\00"
define void @print_usage() {
%1 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([42 x i8], [42 x i8]* @.str, i64 0, i64 0))
%2 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.1, i64 0, i64 0))
%3 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.2, i64 0, i64 0), i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str.3, i64 0, i64 0), i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.4, i64 0, i64 0))
%4 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([29 x i8], [29 x i8]* @.str.5, i64 0, i64 0))
%5 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.1, i64 0, i64 0))
%6 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.6, i64 0, i64 0))
%7 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([71 x i8], [71 x i8]* @.str.7, i64 0, i64 0))
%8 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([66 x i8], [66 x i8]* @.str.8, i64 0, i64 0))
%9 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([61 x i8], [61 x i8]* @.str.9, i64 0, i64 0))
%10 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([96 x i8], [96 x i8]* @.str.10, i64 0, i64 0))
%11 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([73 x i8], [73 x i8]* @.str.11, i64 0, i64 0))
%12 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([95 x i8], [95 x i8]* @.str.12, i64 0, i64 0))
%13 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([73 x i8], [73 x i8]* @.str.13, i64 0, i64 0))
%14 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.1, i64 0, i64 0))
%15 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([98 x i8], [98 x i8]* @.str.14, i64 0, i64 0))
%16 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([106 x i8], [106 x i8]* @.str.15, i64 0, i64 0))
%17 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([59 x i8], [59 x i8]* @.str.16, i64 0, i64 0))
%18 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([59 x i8], [59 x i8]* @.str.17, i64 0, i64 0))
%19 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([81 x i8], [81 x i8]* @.str.18, i64 0, i64 0))
%20 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([89 x i8], [89 x i8]* @.str.19, i64 0, i64 0))
%21 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.1, i64 0, i64 0))
%22 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([24 x i8], [24 x i8]* @.str.20, i64 0, i64 0))
%23 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([91 x i8], [91 x i8]* @.str.21, i64 0, i64 0))
%24 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([97 x i8], [97 x i8]* @.str.22, i64 0, i64 0))
%25 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([97 x i8], [97 x i8]* @.str.23, i64 0, i64 0))
%26 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.1, i64 0, i64 0))
%27 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([19 x i8], [19 x i8]* @.str.24, i64 0, i64 0))
%28 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([120 x i8], [120 x i8]* @.str.25, i64 0, i64 0))
%29 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([120 x i8], [120 x i8]* @.str.25, i64 0, i64 0))
%30 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([106 x i8], [106 x i8]* @.str.26, i64 0, i64 0))
%31 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([97 x i8], [97 x i8]* @.str.27, i64 0, i64 0))
%32 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([75 x i8], [75 x i8]* @.str.28, i64 0, i64 0))
%33 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([75 x i8], [75 x i8]* @.str.29, i64 0, i64 0))
%34 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([71 x i8], [71 x i8]* @.str.30, i64 0, i64 0))
%35 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([100 x i8], [100 x i8]* @.str.31, i64 0, i64 0))
%36 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.1, i64 0, i64 0))
%37 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([21 x i8], [21 x i8]* @.str.32, i64 0, i64 0))
%38 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([88 x i8], [88 x i8]* @.str.33, i64 0, i64 0))
%39 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([58 x i8], [58 x i8]* @.str.34, i64 0, i64 0))
%40 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([58 x i8], [58 x i8]* @.str.35, i64 0, i64 0))
%41 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.1, i64 0, i64 0))
%42 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([27 x i8], [27 x i8]* @.str.36, i64 0, i64 0))
%43 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([86 x i8], [86 x i8]* @.str.37, i64 0, i64 0))
%44 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([85 x i8], [85 x i8]* @.str.38, i64 0, i64 0))
%45 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([87 x i8], [87 x i8]* @.str.39, i64 0, i64 0))
%46 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.1, i64 0, i64 0))
%47 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([112 x i8], [112 x i8]* @.str.40, i64 0, i64 0))
%48 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([112 x i8], [112 x i8]* @.str.41, i64 0, i64 0))
%49 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.1, i64 0, i64 0))
ret void
}

LLVM IR (-O2):
@.str.2 = [16 x i8] c"Version: %s %s\0A\00"
@.str.3 = [12 x i8] c"Mar 18 2022\00"
@.str.4 = [9 x i8] c"04:05:59\00"
@.str.24 = [19 x i8] c"Diff 2 PCAP files:\00"
@str = [41 x i8] c"pcap_latency_analyzer: <pcap A> <pcap B>\00"
@str.42 = [28 x i8] c"Contact: support at fmad.io\00"
@str.43 = [9 x i8] c"Options:\00"
@str.44 = [70 x i8] c" --packet-trace | write each packet events to stdout\00"
@str.45 = [65 x i8] c" --length-histo | print packet length histogram\00"
@str.46 = [60 x i8] c" --latency-histo | print latency histogram \00"
@str.47 = [95 x i8] c" --hash-memory | (int MB) amount of memory to use for hashing. default 128MB\00"
@str.48 = [72 x i8] c" --disable-mmap | use fread not mmap of the pcap files\00"
@str.49 = [94 x i8] c" --packet-time-delta-max | reset time between new and old packets with the same hash.\00"
@str.50 = [72 x i8] c" --packet-max <number> | maximum number of packets to process\00"
@str.51 = [97 x i8] c" --tcp-length <number> | filter tcp packets to include only payload length of <number>\00"
@str.52 = [105 x i8] c" --tcp-length-chomp <number> | set max tcp payload hash to be of length <number>. for packet slicing\00"
@str.53 = [58 x i8] c" --tcp-only | only match tcp packets\00"
@str.54 = [58 x i8] c" --udp-only | only match udp packets\00"
@str.55 = [80 x i8] c" --udp-length <number> | specifiy udp packets of only length <number>\00"
@str.56 = [88 x i8] c" --udp-length-chomp <number> | remove <number> bytes from the end of the UDP packet\00"
@str.57 = [23 x i8] c"Hash the entire packet\00"
@str.58 = [90 x i8] c" --full-packet | use entire packet contents for hash (.e.g no protocol)\00"
@str.59 = [96 x i8] c" --full-packet-tcp-only | use entire packet contents for hash but only for tcp packets\00"
@str.60 = [96 x i8] c" --full-packet-udp-only | use entire packet contents for hash but only for udp packets\00"
@str.62 = [119 x i8] c" --file-diff | special mode of comparing packets between 2 files (instead of within the same file)\00"
@str.63 = [105 x i8] c" --file-diff-no-timesync | do not attempt to time sync the two files. reads 1MB chunks at a time\00"
@str.64 = [96 x i8] c" --file-diff-strict | only matches with two entries in a hash node will be sampled\00"
@str.65 = [74 x i8] c" --file-diff-nofcs-a | file A has no FCS (ethernet crc) value\00"
@str.66 = [74 x i8] c" --file-diff-nofcs-b | file B has no FCS (ethernet crc) value\00"
@str.67 = [70 x i8] c" --file-diff-missing-trace | trace all packets that are missing\00"
@str.68 = [99 x i8] c" --file-diff-latency-trace <number in ns> | trace packets that have latency greather than <number>\00"
@str.69 = [20 x i8] c"Diff 2 MAC address:\00"
@str.70 = [87 x i8] c" --mac-diff | compare packets from 2 mac address in a single PCAP\00"
@str.71 = [57 x i8] c" --mac-diff-a 00:11:22:33:44:55 | specify MAC address A\00"
@str.72 = [57 x i8] c" --mac-diff-b 66:77:88:99:aa:bb | specify MAC address B\00"
@str.73 = [26 x i8] c"Latency histogram shaping\00"
@str.74 = [85 x i8] c" --latency-histo-min | minimum time delta for histogram. default -1e6 ns\00"
@str.75 = [84 x i8] c" --latency-histo-max | maximum time delta for histogram. default 1e6 ns\00"
@str.76 = [86 x i8] c" --latency-histo-unit | duration of a single histogram slot. default 100ns\00"
@str.77 = [111 x i8] c" --ts-last-byte-a | adjust timestamp of first file A from last byte to first byte (assumes 10G)\00"
@str.78 = [111 x i8] c" --ts-last-byte-b | adjust timestamp of first file B from last byte to first byte (assumes 10G)\00"
define void @print_usage() {
%1 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([41 x i8], [41 x i8]* @str, i64 0, i64 0))
%2 = tail call i32 @putchar(i32 10)
%3 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([16 x i8], [16 x i8]* @.str.2, i64 0, i64 0), i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str.3, i64 0, i64 0), i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.4, i64 0, i64 0))
%4 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([28 x i8], [28 x i8]* @str.42, i64 0, i64 0))
%5 = tail call i32 @putchar(i32 10)
%6 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([9 x i8], [9 x i8]* @str.43, i64 0, i64 0))
%7 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([70 x i8], [70 x i8]* @str.44, i64 0, i64 0))
%8 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([65 x i8], [65 x i8]* @str.45, i64 0, i64 0))
%9 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([60 x i8], [60 x i8]* @str.46, i64 0, i64 0))
%10 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([95 x i8], [95 x i8]* @str.47, i64 0, i64 0))
%11 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([72 x i8], [72 x i8]* @str.48, i64 0, i64 0))
%12 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([94 x i8], [94 x i8]* @str.49, i64 0, i64 0))
%13 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([72 x i8], [72 x i8]* @str.50, i64 0, i64 0))
%14 = tail call i32 @putchar(i32 10)
%15 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([97 x i8], [97 x i8]* @str.51, i64 0, i64 0))
%16 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([105 x i8], [105 x i8]* @str.52, i64 0, i64 0))
%17 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([58 x i8], [58 x i8]* @str.53, i64 0, i64 0))
%18 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([58 x i8], [58 x i8]* @str.54, i64 0, i64 0))
%19 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([80 x i8], [80 x i8]* @str.55, i64 0, i64 0))
%20 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([88 x i8], [88 x i8]* @str.56, i64 0, i64 0))
%21 = tail call i32 @putchar(i32 10)
%22 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([23 x i8], [23 x i8]* @str.57, i64 0, i64 0))
%23 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([90 x i8], [90 x i8]* @str.58, i64 0, i64 0))
%24 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([96 x i8], [96 x i8]* @str.59, i64 0, i64 0))
%25 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([96 x i8], [96 x i8]* @str.60, i64 0, i64 0))
%26 = tail call i32 @putchar(i32 10)
%27 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([19 x i8], [19 x i8]* @.str.24, i64 0, i64 0))
%28 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([119 x i8], [119 x i8]* @str.62, i64 0, i64 0))
%29 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([119 x i8], [119 x i8]* @str.62, i64 0, i64 0))
%30 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([105 x i8], [105 x i8]* @str.63, i64 0, i64 0))
%31 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([96 x i8], [96 x i8]* @str.64, i64 0, i64 0))
%32 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([74 x i8], [74 x i8]* @str.65, i64 0, i64 0))
%33 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([74 x i8], [74 x i8]* @str.66, i64 0, i64 0))
%34 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([70 x i8], [70 x i8]* @str.67, i64 0, i64 0))
%35 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([99 x i8], [99 x i8]* @str.68, i64 0, i64 0))
%36 = tail call i32 @putchar(i32 10)
%37 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([20 x i8], [20 x i8]* @str.69, i64 0, i64 0))
%38 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([87 x i8], [87 x i8]* @str.70, i64 0, i64 0))
%39 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([57 x i8], [57 x i8]* @str.71, i64 0, i64 0))
%40 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([57 x i8], [57 x i8]* @str.72, i64 0, i64 0))
%41 = tail call i32 @putchar(i32 10)
%42 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([26 x i8], [26 x i8]* @str.73, i64 0, i64 0))
%43 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([85 x i8], [85 x i8]* @str.74, i64 0, i64 0))
%44 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([84 x i8], [84 x i8]* @str.75, i64 0, i64 0))
%45 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([86 x i8], [86 x i8]* @str.76, i64 0, i64 0))
%46 = tail call i32 @putchar(i32 10)
%47 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([111 x i8], [111 x i8]* @str.77, i64 0, i64 0))
%48 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([111 x i8], [111 x i8]* @str.78, i64 0, i64 0))
%49 = tail call i32 @putchar(i32 10)
ret void
}