#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*/ EXIT_FAILURE;
int /*<<< orphan*/ exit(int /*<<< orphan*/);
int /*<<< orphan*/ fprintf(int /*<<< orphan*/, char *, char *, char *);
int /*<<< orphan*/ stderr;
void usage(char **argv) {
  fprintf(stderr,
          "\n"
          "%s -e reads code points and writes a Punycode string.\n"
          "%s -d reads a Punycode string and writes code points.\n"
          "\n"
          "Input and output are plain text in the native character set.\n"
          "Code points are in the form u+hex separated by whitespace.\n"
          "Although the specification allows Punycode strings to contain\n"
          "any characters from the ASCII repertoire, this test code\n"
          "supports only the printable characters, and needs the Punycode\n"
          "string to be followed by a newline.\n"
          "The case of the u in u+hex is the force-to-uppercase flag.\n",
          argv[0], argv[0]);
  exit(EXIT_FAILURE);
}


x86 assembly (clang, -O0):
<usage>:
push   %rbp
mov    %rsp,%rbp
sub    $0x10,%rsp
mov    %rdi,-0x8(%rbp)
mov    0x2ead(%rip),%rax
mov    (%rax),%edi
mov    -0x8(%rbp),%rax
mov    (%rax),%rdx
mov    -0x8(%rbp),%rax
mov    (%rax),%rcx
lea    0xeb6(%rip),%rsi
call   1030 <fprintf@plt>
mov    0x2e82(%rip),%rax
mov    (%rax),%edi
call   1040 <exit@plt>

x86 assembly (clang, -O2):
<usage>:
push   %rax
mov    0x2eb8(%rip),%rax
mov    (%rax),%eax
mov    (%rdi),%rcx
lea    0xecc(%rip),%rsi
mov    %eax,%edi
mov    %rcx,%rdx
call   1030 <fprintf@plt>
mov    0x2e93(%rip),%rax
mov    (%rax),%edi
call   1040 <exit@plt>

LLVM IR (-O0):
@stderr = global i32 0
@.str = [508 x i8] c"\0A%s -e reads code points and writes a Punycode string.\0A%s -d reads a Punycode string and writes code points.\0A\0AInput and output are plain text in the native character set.\0ACode points are in the form u+hex separated by whitespace.\0AAlthough the specification allows Punycode strings to contain\0Aany characters from the ASCII repertoire, this test code\0Asupports only the printable characters, and needs the Punycode\0Astring to be followed by a newline.\0AThe case of the u in u+hex is the force-to-uppercase flag.\0A\00"
@EXIT_FAILURE = global i32 0
define void @usage(i8** %0) {
%2 = alloca i8**
store i8** %0, i8*** %2
%3 = load i32, i32* @stderr
%4 = load i8**, i8*** %2
%5 = getelementptr inbounds i8*, i8** %4, i64 0
%6 = load i8*, i8** %5
%7 = load i8**, i8*** %2
%8 = getelementptr inbounds i8*, i8** %7, i64 0
%9 = load i8*, i8** %8
%10 = call i32 @fprintf(i32 %3, i8* getelementptr inbounds ([508 x i8], [508 x i8]* @.str, i64 0, i64 0), i8* %6, i8* %9)
%11 = load i32, i32* @EXIT_FAILURE
%12 = call i32 @exit(i32 %11)
unreachable
}

LLVM IR (-O2):
@stderr = global i32 0
@.str = [508 x i8] c"\0A%s -e reads code points and writes a Punycode string.\0A%s -d reads a Punycode string and writes code points.\0A\0AInput and output are plain text in the native character set.\0ACode points are in the form u+hex separated by whitespace.\0AAlthough the specification allows Punycode strings to contain\0Aany characters from the ASCII repertoire, this test code\0Asupports only the printable characters, and needs the Punycode\0Astring to be followed by a newline.\0AThe case of the u in u+hex is the force-to-uppercase flag.\0A\00"
@EXIT_FAILURE = global i32 0
define void @usage(i8** nocapture %0) {
%2 = load i32, i32* @stderr
%3 = load i8*, i8** %0
%4 = tail call i32 @fprintf(i32 %2, i8* getelementptr inbounds ([508 x i8], [508 x i8]* @.str, i64 0, i64 0), i8* %3, i8* %3)
%5 = load i32, i32* @EXIT_FAILURE
%6 = tail call i32 @exit(i32 %5)
unreachable
}