#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 */
char *basename(char *);
int /*<<< orphan*/ printf(char *, char const *, char const *, char const *);
void usage(char *argv0) {
  const char *s = basename(argv0);
  printf("Usage: %s [OPTION] [FILE]...\n"
         "Decode DER from FILE(s), or standard input, to S-expressions.\n"
         "\n"
         "  -e, --encode   encode S-expressions to DER data\n"
         "  -f, --format=FILE  interpret tags in accordance with"
         " the specification\n"
         "  -h, --help     display this help and exit\n"
         "  -V, --version  output version information and exit\n"
         "\n"
         "With no FILE, or when FILE is -, read standard input.\n"
         "\n"
         "Examples:\n"
         "  %s f - g  Decode f's contents, then standard input,"
         " then g's contents.\n"
         "  %s -e     Encode standard input to standard output.\n"
         "\n"
         "Report bugs to valery.vv@gmail.com\n"
         "Home page: <http://github.com/vvv/under.c>\n",
         s, s, s);
}


x86 assembly (clang, -O0):
<usage>:
push   %rbp
mov    %rsp,%rbp
sub    $0x10,%rsp
mov    %rdi,-0x8(%rbp)
mov    -0x8(%rbp),%rdi
call   1040 <basename@plt>
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rsi
mov    -0x10(%rbp),%rdx
mov    -0x10(%rbp),%rcx
lea    0xeb4(%rip),%rdi
call   1030 <printf@plt>
add    $0x10,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<usage>:
push   %rax
call   1040 <basename@plt>
lea    0xed3(%rip),%rdi
mov    %rax,%rsi
mov    %rax,%rdx
mov    %rax,%rcx
pop    %rax
jmp    1030 <printf@plt>

LLVM IR (-O0):
@.str = [585 x i8] c"Usage: %s [OPTION] [FILE]...\0ADecode DER from FILE(s), or standard input, to S-expressions.\0A\0A -e, --encode encode S-expressions to DER data\0A -f, --format=FILE interpret tags in accordance with the specification\0A -h, --help display this help and exit\0A -V, --version output version information and exit\0A\0AWith no FILE, or when FILE is -, read standard input.\0A\0AExamples:\0A %s f - g Decode f's contents, then standard input, then g's contents.\0A %s -e Encode standard input to standard output.\0A\0AReport bugs to valery.vv@gmail.com\0AHome page: <http://github.com/vvv/under.c>\0A\00"
define void @usage(i8* %0) {
%2 = alloca i8*
%3 = alloca i8*
store i8* %0, i8** %2
%4 = load i8*, i8** %2
%5 = call i8* @basename(i8* %4)
store i8* %5, i8** %3
%6 = load i8*, i8** %3
%7 = load i8*, i8** %3
%8 = load i8*, i8** %3
%9 = call i32 @printf(i8* getelementptr inbounds ([585 x i8], [585 x i8]* @.str, i64 0, i64 0), i8* %6, i8* %7, i8* %8)
ret void
}

LLVM IR (-O2):
@.str = [585 x i8] c"Usage: %s [OPTION] [FILE]...\0ADecode DER from FILE(s), or standard input, to S-expressions.\0A\0A -e, --encode encode S-expressions to DER data\0A -f, --format=FILE interpret tags in accordance with the specification\0A -h, --help display this help and exit\0A -V, --version output version information and exit\0A\0AWith no FILE, or when FILE is -, read standard input.\0A\0AExamples:\0A %s f - g Decode f's contents, then standard input, then g's contents.\0A %s -e Encode standard input to standard output.\0A\0AReport bugs to valery.vv@gmail.com\0AHome page: <http://github.com/vvv/under.c>\0A\00"
define void @usage(i8* %0) {
%2 = tail call i8* @basename(i8* %0)
%3 = tail call i32 @printf(i8* getelementptr inbounds ([585 x i8], [585 x i8]* @.str, i64 0, i64 0), i8* %2, i8* %2, i8* %2)
ret void
}