#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 *, ...);
void print_usage(const char *name) {
  printf("usage: %s\n", name);
  printf("\n"
         "	-h, --help:                   print this help\n"
         "	-d, --dump:                   print registers\n"
         "	-w, --write <addr> <data>:    write to register\n"
         "	-r, --read <addr>:            read from register\n"
         "	-b, --read-bit <addr> <bit>   read bit\n"
         "	-c, --clear-bit <addr> <bit>  clear bit\n"
         "	-s, --set-bit <addr> <bit>    set bit\n"
         "\n"
         "Attention! Writing to PMH7 registers is very dangerous, as you\n"
         "           directly manipulate the power rails, enable lines,\n"
         "           interrupt lines or something else of the device.\n"
         "           Proceed with caution."
         "\n");
}


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

x86 assembly (clang, -O2):
<print_usage>:
push   %rax
mov    %rdi,%rsi
lea    0xed5(%rip),%rdi
xor    %eax,%eax
call   1040 <printf@plt>
lea    0xed2(%rip),%rdi
pop    %rax
jmp    1030 <puts@plt>

LLVM IR (-O0):
@.str = [11 x i8] c"usage: %s\0A\00"
@.str.1 = [534 x i8] c"\0A\09-h, --help: print this help\0A\09-d, --dump: print registers\0A\09-w, --write <addr> <data>: write to register\0A\09-r, --read <addr>: read from register\0A\09-b, --read-bit <addr> <bit> read bit\0A\09-c, --clear-bit <addr> <bit> clear bit\0A\09-s, --set-bit <addr> <bit> set bit\0A\0AAttention! Writing to PMH7 registers is very dangerous, as you\0A directly manipulate the power rails, enable lines,\0A interrupt lines or something else of the device.\0A Proceed with caution.\0A\00"
define void @print_usage(i8* %0) {
%2 = alloca i8*
store i8* %0, i8** %2
%3 = load i8*, i8** %2
%4 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str, i64 0, i64 0), i8* %3)
%5 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([534 x i8], [534 x i8]* @.str.1, i64 0, i64 0))
ret void
}

LLVM IR (-O2):
@.str = [11 x i8] c"usage: %s\0A\00"
@str = [533 x i8] c"\0A\09-h, --help: print this help\0A\09-d, --dump: print registers\0A\09-w, --write <addr> <data>: write to register\0A\09-r, --read <addr>: read from register\0A\09-b, --read-bit <addr> <bit> read bit\0A\09-c, --clear-bit <addr> <bit> clear bit\0A\09-s, --set-bit <addr> <bit> set bit\0A\0AAttention! Writing to PMH7 registers is very dangerous, as you\0A directly manipulate the power rails, enable lines,\0A interrupt lines or something else of the device.\0A Proceed with caution.\00"
define void @print_usage(i8* %0) {
%2 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([11 x i8], [11 x i8]* @.str, i64 0, i64 0), i8* %0)
%3 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([533 x i8], [533 x i8]* @str, i64 0, i64 0))
ret void
}