#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*/ fprintf(int /*<<< orphan*/, char *, char const *);
int /*<<< orphan*/ stderr;
void usage(const char *argv0) {
  fprintf(stderr,
          "Usage: %s [<addr> ...] < iplist.csv\n"
          "\n"
          "This program reads lines starting by two IP addresses and outputs "
          "them with\n"
          "the two IP addresses replaced by a netmask covering the range "
          "between these\n"
          "IPs (inclusive). When multiple ranges are needed, as many lines are "
          "emitted.\n"
          "The IP addresses may be delimited by spaces, tabs or commas. Quotes "
          "are\n"
          "stripped, and lines beginning with a sharp character ('#') are "
          "ignored. The\n"
          "IP addresses may be either in the dotted format or represented as a "
          "32-bit\n"
          "integer value in network byte order.\n"
          "\n"
          "For each optional <addr> specified, only the network it belongs to "
          "is returned,\n"
          "prefixed with the <addr> value.\n"
          "\n",
          argv0);
}


x86 assembly (clang, -O0):
<usage>:
push   %rbp
mov    %rsp,%rbp
sub    $0x10,%rsp
mov    %rdi,-0x8(%rbp)
mov    0x2ebd(%rip),%rax
mov    (%rax),%edi
mov    -0x8(%rbp),%rdx
lea    0xed0(%rip),%rsi
call   1030 <fprintf@plt>
add    $0x10,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<usage>:
mov    %rdi,%rdx
mov    0x2ec6(%rip),%rax
mov    (%rax),%edi
lea    0xedd(%rip),%rsi
jmp    1030 <fprintf@plt>

LLVM IR (-O0):
@stderr = global i32 0
@.str = [641 x i8] c"Usage: %s [<addr> ...] < iplist.csv\0A\0AThis program reads lines starting by two IP addresses and outputs them with\0Athe two IP addresses replaced by a netmask covering the range between these\0AIPs (inclusive). When multiple ranges are needed, as many lines are emitted.\0AThe IP addresses may be delimited by spaces, tabs or commas. Quotes are\0Astripped, and lines beginning with a sharp character ('#') are ignored. The\0AIP addresses may be either in the dotted format or represented as a 32-bit\0Ainteger value in network byte order.\0A\0AFor each optional <addr> specified, only the network it belongs to is returned,\0Aprefixed with the <addr> value.\0A\0A\00"
define void @usage(i8* %0) {
%2 = alloca i8*
store i8* %0, i8** %2
%3 = load i32, i32* @stderr
%4 = load i8*, i8** %2
%5 = call i32 @fprintf(i32 %3, i8* getelementptr inbounds ([641 x i8], [641 x i8]* @.str, i64 0, i64 0), i8* %4)
ret void
}

LLVM IR (-O2):
@stderr = global i32 0
@.str = [641 x i8] c"Usage: %s [<addr> ...] < iplist.csv\0A\0AThis program reads lines starting by two IP addresses and outputs them with\0Athe two IP addresses replaced by a netmask covering the range between these\0AIPs (inclusive). When multiple ranges are needed, as many lines are emitted.\0AThe IP addresses may be delimited by spaces, tabs or commas. Quotes are\0Astripped, and lines beginning with a sharp character ('#') are ignored. The\0AIP addresses may be either in the dotted format or represented as a 32-bit\0Ainteger value in network byte order.\0A\0AFor each optional <addr> specified, only the network it belongs to is returned,\0Aprefixed with the <addr> value.\0A\0A\00"
define void @usage(i8* %0) {
%2 = load i32, i32* @stderr
%3 = tail call i32 @fprintf(i32 %2, i8* getelementptr inbounds ([641 x i8], [641 x i8]* @.str, i64 0, i64 0), i8* %0)
ret void
}