void help(void) {
  char *help[] = {
      "usage: [doitclient] subcommand [options] [parameters]",
      "options are:",
      "  -h, --help         display this text",
      "  -V, --version      display doitclient version",
      "  -d, --set-dir      run program in your current directory",
      "  -D, --no-set-dir   run program in DoIt's default directory",
      "  -p, --path-translate    do path translation on command name",
      "  -P, --no-path-translate    do not do path translation on command name",
      "  -v, --verbose      log the transaction to stderr",
      "subcommands are:",
      "  win <command>      start Windows GUI process and don't wait",
      "  winwait <command>  start Windows GUI process and wait for completion",
      "  wcmd <command>     start Windows CLI process and return output",
      "  wf <file>          path-translate a file and open in Windows",
      "  www <URL>          open a URL in Windows's default browser",
      "  wclip              copy stdin to the Windows clipboard",
      "  wclip -r           copy the Windows clipboard to stdout",
      "  wpath              path-translate a filename and print to stdout",
  };
  int i;
  for (i = 0; i < sizeof(help) / sizeof(*help); i++)
    puts(help[i]);
}


x86 assembly (clang, -O0):
<help>:
push   %rbp
mov    %rsp,%rbp
sub    $0xa0,%rsp
lea    -0x90(%rbp),%rdi
lea    0x2c57(%rip),%rsi
mov    $0x90,%edx
call   1040 <memcpy@plt>
movl   $0x0,-0x94(%rbp)
movslq -0x94(%rbp),%rax
cmp    $0x12,%rax
jae    1188 <help+0x68>
movslq -0x94(%rbp),%rax
mov    -0x90(%rbp,%rax,8),%rdi
ff
mov    $0x0,%al
call   1030 <puts@plt>
mov    -0x94(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x94(%rbp)
jmp    114d <help+0x2d>
add    $0xa0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<help>:
push   %rax
lea    0xee8(%rip),%rdi
xor    %eax,%eax
call   1030 <puts@plt>
lea    0xf10(%rip),%rdi
xor    %eax,%eax
call   1030 <puts@plt>
lea    0xf0f(%rip),%rdi
xor    %eax,%eax
call   1030 <puts@plt>
lea    0xf28(%rip),%rdi
xor    %eax,%eax
call   1030 <puts@plt>
lea    0xf4a(%rip),%rdi
xor    %eax,%eax
call   1030 <puts@plt>
lea    0xf77(%rip),%rdi
xor    %eax,%eax
call   1030 <puts@plt>
lea    0xfa6(%rip),%rdi
xor    %eax,%eax
call   1030 <puts@plt>
lea    0xfd6(%rip),%rdi
xor    %eax,%eax
call   1030 <puts@plt>
lea    0x1010(%rip),%rdi
xor    %eax,%eax
call   1030 <puts@plt>
lea    0x1035(%rip),%rdi
xor    %eax,%eax
call   1030 <puts@plt>
lea    0x1038(%rip),%rdi
xor    %eax,%eax
call   1030 <puts@plt>
lea    0x1068(%rip),%rdi
xor    %eax,%eax
call   1030 <puts@plt>
lea    0x10a1(%rip),%rdi
xor    %eax,%eax
call   1030 <puts@plt>
lea    0x10d4(%rip),%rdi
xor    %eax,%eax
call   1030 <puts@plt>
lea    0x1105(%rip),%rdi
xor    %eax,%eax
call   1030 <puts@plt>
lea    0x1134(%rip),%rdi
xor    %eax,%eax
call   1030 <puts@plt>
lea    0x115f(%rip),%rdi
xor    %eax,%eax
call   1030 <puts@plt>
lea    0x118b(%rip),%rdi
xor    %eax,%eax
pop    %rcx
jmp    1030 <puts@plt>

LLVM IR (-O0):
@.str = [54 x i8] c"usage: [doitclient] subcommand [options] [parameters]\00"
@.str.1 = [13 x i8] c"options are:\00"
@.str.2 = [39 x i8] c" -h, --help display this text\00"
@.str.3 = [48 x i8] c" -V, --version display doitclient version\00"
@.str.4 = [59 x i8] c" -d, --set-dir run program in your current directory\00"
@.str.5 = [61 x i8] c" -D, --no-set-dir run program in DoIt's default directory\00"
@.str.6 = [62 x i8] c" -p, --path-translate do path translation on command name\00"
@.str.7 = [72 x i8] c" -P, --no-path-translate do not do path translation on command name\00"
@.str.8 = [51 x i8] c" -v, --verbose log the transaction to stderr\00"
@.str.9 = [17 x i8] c"subcommands are:\00"
@.str.10 = [62 x i8] c" win <command> start Windows GUI process and don't wait\00"
@.str.11 = [71 x i8] c" winwait <command> start Windows GUI process and wait for completion\00"
@.str.12 = [65 x i8] c" wcmd <command> start Windows CLI process and return output\00"
@.str.13 = [63 x i8] c" wf <file> path-translate a file and open in Windows\00"
@.str.14 = [61 x i8] c" www <URL> open a URL in Windows's default browser\00"
@.str.15 = [57 x i8] c" wclip copy stdin to the Windows clipboard\00"
@.str.16 = [58 x i8] c" wclip -r copy the Windows clipboard to stdout\00"
@.str.17 = [67 x i8] c" wpath path-translate a filename and print to stdout\00"
@__const.help.help = [18 x i8*] [i8* getelementptr inbounds ([54 x i8], [54 x i8]* @.str, i32 0, i32 0), i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([39 x i8], [39 x i8]* @.str.2, i32 0, i32 0), i8* getelementptr inbounds ([48 x i8], [48 x i8]* @.str.3, i32 0, i32 0), i8* getelementptr inbounds ([59 x i8], [59 x i8]* @.str.4, i32 0, i32 0), i8* getelementptr inbounds ([61 x i8], [61 x i8]* @.str.5, i32 0, i32 0), i8* getelementptr inbounds ([62 x i8], [62 x i8]* @.str.6, i32 0, i32 0), i8* getelementptr inbounds ([72 x i8], [72 x i8]* @.str.7, i32 0, i32 0), i8* getelementptr inbounds ([51 x i8], [51 x i8]* @.str.8, i32 0, i32 0), i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.9, i32 0, i32 0), i8* getelementptr inbounds ([62 x i8], [62 x i8]* @.str.10, i32 0, i32 0), i8* getelementptr inbounds ([71 x i8], [71 x i8]* @.str.11, i32 0, i32 0), i8* getelementptr inbounds ([65 x i8], [65 x i8]* @.str.12, i32 0, i32 0), i8* getelementptr inbounds ([63 x i8], [63 x i8]* @.str.13, i32 0, i32 0), i8* getelementptr inbounds ([61 x i8], [61 x i8]* @.str.14, i32 0, i32 0), i8* getelementptr inbounds ([57 x i8], [57 x i8]* @.str.15, i32 0, i32 0), i8* getelementptr inbounds ([58 x i8], [58 x i8]* @.str.16, i32 0, i32 0), i8* getelementptr inbounds ([67 x i8], [67 x i8]* @.str.17, i32 0, i32 0)]
define void @help() {
%1 = alloca [18 x i8*]
%2 = alloca i32
%3 = bitcast [18 x i8*]* %1 to i8*
store i32 0, i32* %2
br label %4
4: ; preds = %14, %0
%5 = load i32, i32* %2
%6 = sext i32 %5 to i64
%7 = icmp ult i64 %6, 18
br i1 %7, label %8, label %17
8: ; preds = %4
%9 = load i32, i32* %2
%10 = sext i32 %9 to i64
%11 = getelementptr inbounds [18 x i8*], [18 x i8*]* %1, i64 0, i64 %10
%12 = load i8*, i8** %11
%13 = call i32 (i8*, ...) bitcast (i32 (...)* @puts to i32 (i8*, ...)*)(i8* %12)
br label %14
14: ; preds = %8
%15 = load i32, i32* %2
%16 = add nsw i32 %15, 1
store i32 %16, i32* %2
br label %4
17: ; preds = %4
ret void
}

LLVM IR (-O2):
@.str = [54 x i8] c"usage: [doitclient] subcommand [options] [parameters]\00"
@.str.1 = [13 x i8] c"options are:\00"
@.str.2 = [39 x i8] c" -h, --help display this text\00"
@.str.3 = [48 x i8] c" -V, --version display doitclient version\00"
@.str.4 = [59 x i8] c" -d, --set-dir run program in your current directory\00"
@.str.5 = [61 x i8] c" -D, --no-set-dir run program in DoIt's default directory\00"
@.str.6 = [62 x i8] c" -p, --path-translate do path translation on command name\00"
@.str.7 = [72 x i8] c" -P, --no-path-translate do not do path translation on command name\00"
@.str.8 = [51 x i8] c" -v, --verbose log the transaction to stderr\00"
@.str.9 = [17 x i8] c"subcommands are:\00"
@.str.10 = [62 x i8] c" win <command> start Windows GUI process and don't wait\00"
@.str.11 = [71 x i8] c" winwait <command> start Windows GUI process and wait for completion\00"
@.str.12 = [65 x i8] c" wcmd <command> start Windows CLI process and return output\00"
@.str.13 = [63 x i8] c" wf <file> path-translate a file and open in Windows\00"
@.str.14 = [61 x i8] c" www <URL> open a URL in Windows's default browser\00"
@.str.15 = [57 x i8] c" wclip copy stdin to the Windows clipboard\00"
@.str.16 = [58 x i8] c" wclip -r copy the Windows clipboard to stdout\00"
@.str.17 = [67 x i8] c" wpath path-translate a filename and print to stdout\00"
define void @help() {
%1 = tail call i32 (i8*, ...) bitcast (i32 (...)* @puts to i32 (i8*, ...)*)(i8* getelementptr inbounds ([54 x i8], [54 x i8]* @.str, i64 0, i64 0))
%2 = tail call i32 (i8*, ...) bitcast (i32 (...)* @puts to i32 (i8*, ...)*)(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @.str.1, i64 0, i64 0))
%3 = tail call i32 (i8*, ...) bitcast (i32 (...)* @puts to i32 (i8*, ...)*)(i8* getelementptr inbounds ([39 x i8], [39 x i8]* @.str.2, i64 0, i64 0))
%4 = tail call i32 (i8*, ...) bitcast (i32 (...)* @puts to i32 (i8*, ...)*)(i8* getelementptr inbounds ([48 x i8], [48 x i8]* @.str.3, i64 0, i64 0))
%5 = tail call i32 (i8*, ...) bitcast (i32 (...)* @puts to i32 (i8*, ...)*)(i8* getelementptr inbounds ([59 x i8], [59 x i8]* @.str.4, i64 0, i64 0))
%6 = tail call i32 (i8*, ...) bitcast (i32 (...)* @puts to i32 (i8*, ...)*)(i8* getelementptr inbounds ([61 x i8], [61 x i8]* @.str.5, i64 0, i64 0))
%7 = tail call i32 (i8*, ...) bitcast (i32 (...)* @puts to i32 (i8*, ...)*)(i8* getelementptr inbounds ([62 x i8], [62 x i8]* @.str.6, i64 0, i64 0))
%8 = tail call i32 (i8*, ...) bitcast (i32 (...)* @puts to i32 (i8*, ...)*)(i8* getelementptr inbounds ([72 x i8], [72 x i8]* @.str.7, i64 0, i64 0))
%9 = tail call i32 (i8*, ...) bitcast (i32 (...)* @puts to i32 (i8*, ...)*)(i8* getelementptr inbounds ([51 x i8], [51 x i8]* @.str.8, i64 0, i64 0))
%10 = tail call i32 (i8*, ...) bitcast (i32 (...)* @puts to i32 (i8*, ...)*)(i8* getelementptr inbounds ([17 x i8], [17 x i8]* @.str.9, i64 0, i64 0))
%11 = tail call i32 (i8*, ...) bitcast (i32 (...)* @puts to i32 (i8*, ...)*)(i8* getelementptr inbounds ([62 x i8], [62 x i8]* @.str.10, i64 0, i64 0))
%12 = tail call i32 (i8*, ...) bitcast (i32 (...)* @puts to i32 (i8*, ...)*)(i8* getelementptr inbounds ([71 x i8], [71 x i8]* @.str.11, i64 0, i64 0))
%13 = tail call i32 (i8*, ...) bitcast (i32 (...)* @puts to i32 (i8*, ...)*)(i8* getelementptr inbounds ([65 x i8], [65 x i8]* @.str.12, i64 0, i64 0))
%14 = tail call i32 (i8*, ...) bitcast (i32 (...)* @puts to i32 (i8*, ...)*)(i8* getelementptr inbounds ([63 x i8], [63 x i8]* @.str.13, i64 0, i64 0))
%15 = tail call i32 (i8*, ...) bitcast (i32 (...)* @puts to i32 (i8*, ...)*)(i8* getelementptr inbounds ([61 x i8], [61 x i8]* @.str.14, i64 0, i64 0))
%16 = tail call i32 (i8*, ...) bitcast (i32 (...)* @puts to i32 (i8*, ...)*)(i8* getelementptr inbounds ([57 x i8], [57 x i8]* @.str.15, i64 0, i64 0))
%17 = tail call i32 (i8*, ...) bitcast (i32 (...)* @puts to i32 (i8*, ...)*)(i8* getelementptr inbounds ([58 x i8], [58 x i8]* @.str.16, i64 0, i64 0))
%18 = tail call i32 (i8*, ...) bitcast (i32 (...)* @puts to i32 (i8*, ...)*)(i8* getelementptr inbounds ([67 x i8], [67 x i8]* @.str.17, i64 0, i64 0))
ret void
}