#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*/ fprintf(int /*<<< orphan*/, char *, char *);
int /*<<< orphan*/ stderr;
void usage(int argc, char **argv) {
  (void)argc;
  fprintf(stderr,
          "Usage: %s mode    [OPTIONS]\n"
          "          tests\n"
          "          hash    fun [in]\n"
          "          encrypt fun key [in [out]]\n"
          "          decrypt fun key [in [out]]\n"
          "\n"
          "PARAMS:\n"
          "  fun  the function to use (md2, md4, md5, sha1, sha256, sha224, "
          "sha512, sha384)\n"
          "  in   an input file (default: stdin)\n"
          "  out  an output file (default: stdout)\n"
          "  key  a cipher key file\n"
          "\n"
          "mode:\n"
          "  tests    run validity tests on digest functions\n"
          "  hash     hash the input\n"
          "  encrypt  performs encryption on the input using the key\n"
          "  decrypt  performs decryption on the input using the key\n",
          argv[0]);
}


x86 assembly (clang, -O0):
<usage>:
push   %rbp
mov    %rsp,%rbp
sub    $0x10,%rsp
mov    %edi,-0x4(%rbp)
mov    %rsi,-0x10(%rbp)
mov    0x2eba(%rip),%rax
mov    (%rax),%edi
mov    -0x10(%rbp),%rax
mov    (%rax),%rdx
lea    0xeca(%rip),%rsi
call   1030 <fprintf@plt>
add    $0x10,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<usage>:
mov    0x2ec9(%rip),%rax
mov    (%rax),%edi
mov    (%rsi),%rdx
lea    0xedd(%rip),%rsi
jmp    1030 <fprintf@plt>

LLVM IR (-O0):
@stderr = global i32 0
@.str = [538 x i8] c"Usage: %s mode [OPTIONS]\0A tests\0A hash fun [in]\0A encrypt fun key [in [out]]\0A decrypt fun key [in [out]]\0A\0APARAMS:\0A fun the function to use (md2, md4, md5, sha1, sha256, sha224, sha512, sha384)\0A in an input file (default: stdin)\0A out an output file (default: stdout)\0A key a cipher key file\0A\0Amode:\0A tests run validity tests on digest functions\0A hash hash the input\0A encrypt performs encryption on the input using the key\0A decrypt performs decryption on the input using the key\0A\00"
define void @usage(i32 %0, i8** %1) {
%3 = alloca i32
%4 = alloca i8**
store i32 %0, i32* %3
store i8** %1, i8*** %4
%5 = load i32, i32* %3
%6 = load i32, i32* @stderr
%7 = load i8**, i8*** %4
%8 = getelementptr inbounds i8*, i8** %7, i64 0
%9 = load i8*, i8** %8
%10 = call i32 @fprintf(i32 %6, i8* getelementptr inbounds ([538 x i8], [538 x i8]* @.str, i64 0, i64 0), i8* %9)
ret void
}

LLVM IR (-O2):
@stderr = global i32 0
@.str = [538 x i8] c"Usage: %s mode [OPTIONS]\0A tests\0A hash fun [in]\0A encrypt fun key [in [out]]\0A decrypt fun key [in [out]]\0A\0APARAMS:\0A fun the function to use (md2, md4, md5, sha1, sha256, sha224, sha512, sha384)\0A in an input file (default: stdin)\0A out an output file (default: stdout)\0A key a cipher key file\0A\0Amode:\0A tests run validity tests on digest functions\0A hash hash the input\0A encrypt performs encryption on the input using the key\0A decrypt performs decryption on the input using the key\0A\00"
define void @usage(i32 %0, i8** nocapture %1) {
%3 = load i32, i32* @stderr
%4 = load i8*, i8** %1
%5 = tail call i32 @fprintf(i32 %3, i8* getelementptr inbounds ([538 x i8], [538 x i8]* @.str, i64 0, i64 0), i8* %4)
ret void
}