Skip to main content

Print Handler

In the XVR AOT compiler, printing is provided via std::print() from the standard library.

Note: The standalone print() statement is no longer supported. Use std::print() instead.

std::print("Hello, world!");
std::print("Value: {}", 42);
std::print("Name: {}, Age: {}", name, age);

Using a standalone print() will result in a compilation error:

print("Hello");  // Error: print() is not supported, use std::print() instead

String Interpolation

XVR uses {} placeholders for formatted output:

var x = 10;
var y = 20;
std::print("{} + {} = {}", x, y, x + y); // 10 + 20 = 30

Type Inference

The format string parser automatically detects argument types:

TypeExampleprintf format
string"hello"%s
integer42%d
float3.14%lf
booleantrue%s

Security

Only literal strings are parsed as format strings:

var userInput = getInput();
std::print(userInput); // Passed directly to printf (safe)
std::print("{}", userInput); // Also safe - uses %s for strings

Implementation

The compiler generates code like:

// Runtime (linked automatically)
#include <stdio.h>
#include <stdarg.h>
int printf(const char *fmt, ...) {
va_list args;
va_start(args, fmt);
int result = vprintf(fmt, args);
va_end(args);
return result;
}

LLVM IR Generation

var name = "world";
std::print("Hello, {}!", name);

Generates:

@fmt_str = private unnamed_addr constant [11 x i8] c"Hello, %s!\00", align 1

define i32 @main() {
entry:
%name = alloca ptr, align 8
store ptr @str_literal, ptr %name, align 8
%name1 = load ptr, ptr %name, align 8
%printf_call = call i32 (ptr, ...) @printf(ptr @fmt_str, ptr %name1)
ret i32 0
}

Command Line

The -n flag disables trailing newlines (if supported by runtime).