#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 *, char *);
void usage(char *self) {
  printf("Usage: %s [OPTION] [!] COMMAND [ARGUMENT...]\n"
         "\n"
         "This tool reads a list of files from stdin, pipes the contents of "
         "each file\ninto the specified command and prints the name of the "
         "file if the command\nsucceeds. The name of the file is exposed to "
         "the command via the environment\nvariable QUERY_FILENAME.\n"
         "\n"
         "Option parsing stops at the first non-option argument.\n"
         "\n"
         "Exit statuses:\n"
         " 1     Fatal error encountered.\n"
         " 2     Non-fatal error encountered.\n"
         "\n"
         "Options:\n"
         " -!    Only print filenames when the COMMAND fails.\n"
         " -0    File names are delimited by null bytes.\n"
         " -h    Show this text and exit.\n"
         " -n    File names are line-delimited. This the default behavior.\n"
         " -s    Redirect stderr from the COMMAND to /dev/null.\n"
         " -w    File names are delimited by ASCII whitespace.\n",
         self);
}


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

x86 assembly (clang, -O2):
<usage>:
mov    %rdi,%rsi
lea    0xee6(%rip),%rdi
jmp    1030 <printf@plt>

LLVM IR (-O0):
@.str = [752 x i8] c"Usage: %s [OPTION] [!] COMMAND [ARGUMENT...]\0A\0AThis tool reads a list of files from stdin, pipes the contents of each file\0Ainto the specified command and prints the name of the file if the command\0Asucceeds. The name of the file is exposed to the command via the environment\0Avariable QUERY_FILENAME.\0A\0AOption parsing stops at the first non-option argument.\0A\0AExit statuses:\0A 1 Fatal error encountered.\0A 2 Non-fatal error encountered.\0A\0AOptions:\0A -! Only print filenames when the COMMAND fails.\0A -0 File names are delimited by null bytes.\0A -h Show this text and exit.\0A -n File names are line-delimited. This the default behavior.\0A -s Redirect stderr from the COMMAND to /dev/null.\0A -w File names are delimited by ASCII whitespace.\0A\00"
define void @usage(i8* %0) {
%2 = alloca i8*
store i8* %0, i8** %2
%3 = load i8*, i8** %2
%4 = call i32 @printf(i8* getelementptr inbounds ([752 x i8], [752 x i8]* @.str, i64 0, i64 0), i8* %3)
ret void
}

LLVM IR (-O2):
@.str = [752 x i8] c"Usage: %s [OPTION] [!] COMMAND [ARGUMENT...]\0A\0AThis tool reads a list of files from stdin, pipes the contents of each file\0Ainto the specified command and prints the name of the file if the command\0Asucceeds. The name of the file is exposed to the command via the environment\0Avariable QUERY_FILENAME.\0A\0AOption parsing stops at the first non-option argument.\0A\0AExit statuses:\0A 1 Fatal error encountered.\0A 2 Non-fatal error encountered.\0A\0AOptions:\0A -! Only print filenames when the COMMAND fails.\0A -0 File names are delimited by null bytes.\0A -h Show this text and exit.\0A -n File names are line-delimited. This the default behavior.\0A -s Redirect stderr from the COMMAND to /dev/null.\0A -w File names are delimited by ASCII whitespace.\0A\00"
define void @usage(i8* %0) {
%2 = tail call i32 @printf(i8* getelementptr inbounds ([752 x i8], [752 x i8]* @.str, i64 0, i64 0), i8* %0)
ret void
}