#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(void) {
  printf(
      "Usage: imx_uart [OPTIONS...] UART CONFIG [JOBS...]\n"
      "  e.g. imx_uart -n /dev/ttyUSB0 vybrid_usb_work.conf u-boot.imx\n"
      "Load data on target connected to UART using serial download protocol "
      "as\n"
      "configured in CONFIG file.\n"
      "\n"
      "Where OPTIONS are\n"
      "   -h --help		Show this help\n"
      "   -v --verify		Verify downloaded data\n"
      "   -n --no-rtscts	Do not use RTS/CTS flow control\n"
      "			Default is to use RTS/CTS, Vybrid requires them\n"
      "\n"
      "And where [JOBS...] are\n"
      "   FILE [-lLOADADDR] [-sSIZE] ...\n"
      "Multiple jobs can be configured. The first job is treated special, "
      "load\n"
      "address, jump address, and length are read from the IVT header. If no "
      "job\n"
      "is specified, the jobs definied in the target specific configuration "
      "file\n"
      "is being used.\n");
}


x86 assembly (clang, -O0):
<print_usage>:
push   %rbp
mov    %rsp,%rbp
lea    0xee5(%rip),%rdi
call   1030 <printf@plt>
pop    %rbp
ret

x86 assembly (clang, -O2):
<print_usage>:
lea    0xee9(%rip),%rdi
jmp    1030 <puts@plt>

LLVM IR (-O0):
@.str = [697 x i8] c"Usage: imx_uart [OPTIONS...] UART CONFIG [JOBS...]\0A e.g. imx_uart -n /dev/ttyUSB0 vybrid_usb_work.conf u-boot.imx\0ALoad data on target connected to UART using serial download protocol as\0Aconfigured in CONFIG file.\0A\0AWhere OPTIONS are\0A -h --help\09\09Show this help\0A -v --verify\09\09Verify downloaded data\0A -n --no-rtscts\09Do not use RTS/CTS flow control\0A\09\09\09Default is to use RTS/CTS, Vybrid requires them\0A\0AAnd where [JOBS...] are\0A FILE [-lLOADADDR] [-sSIZE] ...\0AMultiple jobs can be configured. The first job is treated special, load\0Aaddress, jump address, and length are read from the IVT header. If no job\0Ais specified, the jobs definied in the target specific configuration file\0Ais being used.\0A\00"
define void @print_usage() {
%1 = call i32 @printf(i8* getelementptr inbounds ([697 x i8], [697 x i8]* @.str, i64 0, i64 0))
ret void
}

LLVM IR (-O2):
@str = [696 x i8] c"Usage: imx_uart [OPTIONS...] UART CONFIG [JOBS...]\0A e.g. imx_uart -n /dev/ttyUSB0 vybrid_usb_work.conf u-boot.imx\0ALoad data on target connected to UART using serial download protocol as\0Aconfigured in CONFIG file.\0A\0AWhere OPTIONS are\0A -h --help\09\09Show this help\0A -v --verify\09\09Verify downloaded data\0A -n --no-rtscts\09Do not use RTS/CTS flow control\0A\09\09\09Default is to use RTS/CTS, Vybrid requires them\0A\0AAnd where [JOBS...] are\0A FILE [-lLOADADDR] [-sSIZE] ...\0AMultiple jobs can be configured. The first job is treated special, load\0Aaddress, jump address, and length are read from the IVT header. If no job\0Ais specified, the jobs definied in the target specific configuration file\0Ais being used.\00"
define void @print_usage() {
%1 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([696 x i8], [696 x i8]* @str, i64 0, i64 0))
ret void
}