void cmdshell_print_help(void) {
  const char *lines[] = {
      "\n",
      "Help info:\n",
      "\n",
      "init write        --  initialize options for writing\n",
      "                      (source, destination, offset, cipher)\n"
      "init write dir    --  initialize write directory data\n",
      "                      (description)\n",
      "init write file   --  initialize write file data\n",
      "                      (archive filename, description, relative "
      "offset)\n",
      "init read         --  initialize options for reading\n",
      "                      (source, destination, offset, cipher)\n"
      "init password     --  initialize password for read and write "
      "operations\n",
      "status write      --  show set write options\n",
      "status write dir  --  show write directory contents\n",
      "status write file --  show write file data\n",
      "status read       --  show set read options\n",
      "status password   --  show set password for read and write operations\n",
      "write dir         --  write directory data to destination\n",
      "write file        --  write file data and contents to destination\n",
      "\n",
      "help              --  print this info\n",
      "quit              --  exit the command shell\n",
      "\n"};
  info_printer(lines, (sizeof(lines) / sizeof(lines)[0]));
}


x86 assembly (clang, -O0):
<cmdshell_print_help>:
push   %rbp
mov    %rsp,%rbp
sub    $0xb0,%rsp
lea    -0xb0(%rbp),%rdi
lea    0x2c37(%rip),%rsi
mov    $0xa8,%edx
call   1030 <memcpy@plt>
lea    -0xb0(%rbp),%rdi
mov    $0x15,%esi
mov    $0x0,%al
call   1040 <info_printer@plt>
add    $0xb0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<cmdshell_print_help>:
push   %rbx
sub    $0xb0,%rsp
lea    0x2c41(%rip),%rsi
mov    %rsp,%rbx
mov    $0xa8,%edx
mov    %rbx,%rdi
call   1030 <memcpy@plt>
mov    $0x15,%esi
mov    %rbx,%rdi
xor    %eax,%eax
call   1040 <info_printer@plt>
add    $0xb0,%rsp
pop    %rbx
ret

LLVM IR (-O0):
@.str = [2 x i8] c"\0A\00"
@.str.1 = [12 x i8] c"Help info:\0A\00"
@.str.2 = [54 x i8] c"init write -- initialize options for writing\0A\00"
@.str.3 = [115 x i8] c" (source, destination, offset, cipher)\0Ainit write dir -- initialize write directory data\0A\00"
@.str.4 = [37 x i8] c" (description)\0A\00"
@.str.5 = [50 x i8] c"init write file -- initialize write file data\0A\00"
@.str.6 = [72 x i8] c" (archive filename, description, relative offset)\0A\00"
@.str.7 = [54 x i8] c"init read -- initialize options for reading\0A\00"
@.str.8 = [133 x i8] c" (source, destination, offset, cipher)\0Ainit password -- initialize password for read and write operations\0A\00"
@.str.9 = [46 x i8] c"status write -- show set write options\0A\00"
@.str.10 = [53 x i8] c"status write dir -- show write directory contents\0A\00"
@.str.11 = [44 x i8] c"status write file -- show write file data\0A\00"
@.str.12 = [45 x i8] c"status read -- show set read options\0A\00"
@.str.13 = [71 x i8] c"status password -- show set password for read and write operations\0A\00"
@.str.14 = [59 x i8] c"write dir -- write directory data to destination\0A\00"
@.str.15 = [67 x i8] c"write file -- write file data and contents to destination\0A\00"
@.str.16 = [39 x i8] c"help -- print this info\0A\00"
@.str.17 = [46 x i8] c"quit -- exit the command shell\0A\00"
@__const.cmdshell_print_help.lines = [21 x i8*] [i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i32 0, i32 0), i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i32 0, i32 0), i8* getelementptr inbounds ([54 x i8], [54 x i8]* @.str.2, i32 0, i32 0), i8* getelementptr inbounds ([115 x i8], [115 x i8]* @.str.3, i32 0, i32 0), i8* getelementptr inbounds ([37 x i8], [37 x i8]* @.str.4, i32 0, i32 0), i8* getelementptr inbounds ([50 x i8], [50 x i8]* @.str.5, i32 0, i32 0), i8* getelementptr inbounds ([72 x i8], [72 x i8]* @.str.6, i32 0, i32 0), i8* getelementptr inbounds ([54 x i8], [54 x i8]* @.str.7, i32 0, i32 0), i8* getelementptr inbounds ([133 x i8], [133 x i8]* @.str.8, i32 0, i32 0), i8* getelementptr inbounds ([46 x i8], [46 x i8]* @.str.9, i32 0, i32 0), i8* getelementptr inbounds ([53 x i8], [53 x i8]* @.str.10, i32 0, i32 0), i8* getelementptr inbounds ([44 x i8], [44 x i8]* @.str.11, i32 0, i32 0), i8* getelementptr inbounds ([45 x i8], [45 x i8]* @.str.12, i32 0, i32 0), i8* getelementptr inbounds ([71 x i8], [71 x i8]* @.str.13, i32 0, i32 0), i8* getelementptr inbounds ([59 x i8], [59 x i8]* @.str.14, i32 0, i32 0), i8* getelementptr inbounds ([67 x i8], [67 x i8]* @.str.15, i32 0, i32 0), i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i32 0, i32 0), i8* getelementptr inbounds ([39 x i8], [39 x i8]* @.str.16, i32 0, i32 0), i8* getelementptr inbounds ([46 x i8], [46 x i8]* @.str.17, i32 0, i32 0), i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i32 0, i32 0)]
define void @cmdshell_print_help() {
%1 = alloca [21 x i8*]
%2 = bitcast [21 x i8*]* %1 to i8*
%3 = getelementptr inbounds [21 x i8*], [21 x i8*]* %1, i64 0, i64 0
%4 = call i32 (i8**, i64, ...) bitcast (i32 (...)* @info_printer to i32 (i8**, i64, ...)*)(i8** %3, i64 21)
ret void
}

LLVM IR (-O2):
@.str = [2 x i8] c"\0A\00"
@.str.1 = [12 x i8] c"Help info:\0A\00"
@.str.2 = [54 x i8] c"init write -- initialize options for writing\0A\00"
@.str.3 = [115 x i8] c" (source, destination, offset, cipher)\0Ainit write dir -- initialize write directory data\0A\00"
@.str.4 = [37 x i8] c" (description)\0A\00"
@.str.5 = [50 x i8] c"init write file -- initialize write file data\0A\00"
@.str.6 = [72 x i8] c" (archive filename, description, relative offset)\0A\00"
@.str.7 = [54 x i8] c"init read -- initialize options for reading\0A\00"
@.str.8 = [133 x i8] c" (source, destination, offset, cipher)\0Ainit password -- initialize password for read and write operations\0A\00"
@.str.9 = [46 x i8] c"status write -- show set write options\0A\00"
@.str.10 = [53 x i8] c"status write dir -- show write directory contents\0A\00"
@.str.11 = [44 x i8] c"status write file -- show write file data\0A\00"
@.str.12 = [45 x i8] c"status read -- show set read options\0A\00"
@.str.13 = [71 x i8] c"status password -- show set password for read and write operations\0A\00"
@.str.14 = [59 x i8] c"write dir -- write directory data to destination\0A\00"
@.str.15 = [67 x i8] c"write file -- write file data and contents to destination\0A\00"
@.str.16 = [39 x i8] c"help -- print this info\0A\00"
@.str.17 = [46 x i8] c"quit -- exit the command shell\0A\00"
@__const.cmdshell_print_help.lines = [21 x i8*] [i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i32 0, i32 0), i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str.1, i32 0, i32 0), i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i32 0, i32 0), i8* getelementptr inbounds ([54 x i8], [54 x i8]* @.str.2, i32 0, i32 0), i8* getelementptr inbounds ([115 x i8], [115 x i8]* @.str.3, i32 0, i32 0), i8* getelementptr inbounds ([37 x i8], [37 x i8]* @.str.4, i32 0, i32 0), i8* getelementptr inbounds ([50 x i8], [50 x i8]* @.str.5, i32 0, i32 0), i8* getelementptr inbounds ([72 x i8], [72 x i8]* @.str.6, i32 0, i32 0), i8* getelementptr inbounds ([54 x i8], [54 x i8]* @.str.7, i32 0, i32 0), i8* getelementptr inbounds ([133 x i8], [133 x i8]* @.str.8, i32 0, i32 0), i8* getelementptr inbounds ([46 x i8], [46 x i8]* @.str.9, i32 0, i32 0), i8* getelementptr inbounds ([53 x i8], [53 x i8]* @.str.10, i32 0, i32 0), i8* getelementptr inbounds ([44 x i8], [44 x i8]* @.str.11, i32 0, i32 0), i8* getelementptr inbounds ([45 x i8], [45 x i8]* @.str.12, i32 0, i32 0), i8* getelementptr inbounds ([71 x i8], [71 x i8]* @.str.13, i32 0, i32 0), i8* getelementptr inbounds ([59 x i8], [59 x i8]* @.str.14, i32 0, i32 0), i8* getelementptr inbounds ([67 x i8], [67 x i8]* @.str.15, i32 0, i32 0), i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i32 0, i32 0), i8* getelementptr inbounds ([39 x i8], [39 x i8]* @.str.16, i32 0, i32 0), i8* getelementptr inbounds ([46 x i8], [46 x i8]* @.str.17, i32 0, i32 0), i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str, i32 0, i32 0)]
define void @cmdshell_print_help() {
%1 = alloca [21 x i8*]
%2 = bitcast [21 x i8*]* %1 to i8*
%3 = getelementptr inbounds [21 x i8*], [21 x i8*]* %1, i64 0, i64 0
%4 = call i32 (i8**, i64, ...) bitcast (i32 (...)* @info_printer to i32 (i8**, i64, ...)*)(i8** %3, i64 21)
ret void
}