#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*/ print_version();
int /*<<< orphan*/ printf(char *);
void print_help() {
  print_version();
  printf(
      "\nUsage:\n"
      "  sink [options] [ -e '<code>' | <file> ] [arguments]\n"
      "\n"
      "With no arguments, sink will enter interactive mode (REPL).\n"
      "\n"
      "Option           Description\n"
      "  -v               Display version information and exit\n"
      "  -h, --help       Display help information and exit\n"
      "  -I <path>        Add <path> to the include search path\n"
      "  -c               Compile input and output bytecode to stdout\n"
      "  -d               If compiling, output bytecode with debug info\n"
      "  -D <key> <file>  If compiling, add <file> declarations when including "
      "<key>\n"
      "\n"
      "  The -D option is useful for providing declarations so that "
      "compilation can\n"
      "  succeed for other host environments.\n"
      "\n"
      "  For example, a host might provide declarations for native commands "
      "via:\n"
      "\n"
      "    include 'shapes'\n"
      "\n"
      "  The host could provide a declaration file, which can be used during\n"
      "  compilation using a `-D shapes shapes_decl.sink` option.  This means "
      "when the\n"
      "  script executes `include 'shapes'`, the compiler will load "
      "`shapes_decl.sink`.\n"
      "  Even though the compiler doesn't know how to execute the host "
      "commands, it can\n"
      "  still compile the file for use in the host environment.\n");
}


x86 assembly (clang, -O0):
<print_help>:
push   %rbp
mov    %rsp,%rbp
mov    $0x0,%al
call   1030 <print_version@plt>
lea    0xece(%rip),%rdi
call   1040 <printf@plt>
pop    %rbp
ret

x86 assembly (clang, -O2):
<print_help>:
push   %rax
xor    %eax,%eax
call   1040 <print_version@plt>
lea    0xed1(%rip),%rdi
pop    %rax
jmp    1030 <puts@plt>

LLVM IR (-O0):
@.str = [1111 x i8] c"\0AUsage:\0A sink [options] [ -e '<code>' | <file> ] [arguments]\0A\0AWith no arguments, sink will enter interactive mode (REPL).\0A\0AOption Description\0A -v Display version information and exit\0A -h, --help Display help information and exit\0A -I <path> Add <path> to the include search path\0A -c Compile input and output bytecode to stdout\0A -d If compiling, output bytecode with debug info\0A -D <key> <file> If compiling, add <file> declarations when including <key>\0A\0A The -D option is useful for providing declarations so that compilation can\0A succeed for other host environments.\0A\0A For example, a host might provide declarations for native commands via:\0A\0A include 'shapes'\0A\0A The host could provide a declaration file, which can be used during\0A compilation using a `-D shapes shapes_decl.sink` option. This means when the\0A script executes `include 'shapes'`, the compiler will load `shapes_decl.sink`.\0A Even though the compiler doesn't know how to execute the host commands, it can\0A still compile the file for use in the host environment.\0A\00"
define void @print_help() {
%1 = call i32 (...) @print_version()
%2 = call i32 @printf(i8* getelementptr inbounds ([1111 x i8], [1111 x i8]* @.str, i64 0, i64 0))
ret void
}

LLVM IR (-O2):
@str = [1110 x i8] c"\0AUsage:\0A sink [options] [ -e '<code>' | <file> ] [arguments]\0A\0AWith no arguments, sink will enter interactive mode (REPL).\0A\0AOption Description\0A -v Display version information and exit\0A -h, --help Display help information and exit\0A -I <path> Add <path> to the include search path\0A -c Compile input and output bytecode to stdout\0A -d If compiling, output bytecode with debug info\0A -D <key> <file> If compiling, add <file> declarations when including <key>\0A\0A The -D option is useful for providing declarations so that compilation can\0A succeed for other host environments.\0A\0A For example, a host might provide declarations for native commands via:\0A\0A include 'shapes'\0A\0A The host could provide a declaration file, which can be used during\0A compilation using a `-D shapes shapes_decl.sink` option. This means when the\0A script executes `include 'shapes'`, the compiler will load `shapes_decl.sink`.\0A Even though the compiler doesn't know how to execute the host commands, it can\0A still compile the file for use in the host environment.\00"
define void @print_help() {
%1 = tail call i32 (...) @print_version()
%2 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([1110 x i8], [1110 x i8]* @str, i64 0, i64 0))
ret void
}