targets command shows which ones are native

master
Andrew Kelley 2016-02-10 16:35:07 -07:00
parent 1ff2edf67e
commit b642604691
4 changed files with 62 additions and 19 deletions

View File

@ -242,7 +242,11 @@ TODO
TODO
### Error Type
### Pure Error Type
TODO
### Error Union Type
TODO
@ -334,35 +338,43 @@ TODO
Built-in functions are prefixed with `@`.
### Typeof
### @typeof
TODO
`@typeof(expression)`
### Sizeof
### @sizeof
TODO
`@sizeof(type)`
### Overflow Arithmetic
Overflow arithmetic functions have defined behavior on overflow or underflow. TODO what is that behaviour?
Overflow arithmetic functions have defined behavior on overflow or underflow.
The functions take an integer (TODO float?) type, two variables of the specified type, and a pointer to a variable of the specified type where the result is stored. The functions return a boolean value: true of overflow/underflow occurred, false otherwise.
The functions take an integer type, two variables of the specified type, and a
pointer to a variable of the specified type where the result is stored. The
functions return a boolean value: true of overflow/underflow occurred, false
otherwise.
```
Function Operation
bool add_with_overflow(T: type, a: T, b: T, x: &T) *x = a + b
bool sub_with_overflow(T: type, a: T, b: T, x: &T) *x = a - b
bool mul_with_overflow(T: type, a: T, b: T, x: &T) *x = a * b
@add_with_overflow(T: type, a: T, b: T, x: &T) -> bool *x = a + b
@sub_with_overflow(T: type, a: T, b: T, x: &T) -> bool *x = a - b
@mul_with_overflow(T: type, a: T, b: T, x: &T) -> bool *x = a * b
```
### Memory Operations
### @memset
TODO memset and memcpy
`@memset(dest, char, len)`
### Value Count
### @memcpy
TODO
`@memcpy(dest, source, len)`
### @member_count
`@member_count(enum_type)`
### Max and Min Value
TODO
`@max_value(type)`
`@min_value(type)`

View File

@ -43,16 +43,27 @@ static int usage(const char *arg0) {
}
static int print_target_list(FILE *f) {
ZigLLVM_ArchType native_arch_type;
ZigLLVM_SubArchType native_sub_arch_type;
ZigLLVM_VendorType native_vendor_type;
ZigLLVM_OSType native_os_type;
ZigLLVM_EnvironmentType native_environ_type;
ZigLLVMGetNativeTarget(&native_arch_type, &native_sub_arch_type, &native_vendor_type,
&native_os_type, &native_environ_type);
fprintf(f, "Architectures:\n");
int arch_count = target_arch_count();
int sub_arch_count = target_sub_arch_count();
for (int arch_i = 0; arch_i < arch_count; arch_i += 1) {
const ArchType *arch = get_target_arch(arch_i);
fprintf(f, " %s\n", ZigLLVMGetArchTypeName(arch->llvm_arch));
const char *native_str = (native_arch_type == arch->llvm_arch) ? " (native)" : "";
fprintf(f, " %s%s\n", ZigLLVMGetArchTypeName(arch->llvm_arch), native_str);
for (int sub_arch_i = 0; sub_arch_i < sub_arch_count; sub_arch_i += 1) {
const SubArchType *sub_arch = get_target_sub_arch(sub_arch_i);
if (sub_arch->arch == arch->llvm_arch) {
fprintf(f, " %s\n", sub_arch->name);
const char *native_str = (native_sub_arch_type == sub_arch->sub_arch) ? " (native)" : "";
fprintf(f, " %s%s\n", sub_arch->name, native_str);
}
}
}
@ -61,14 +72,16 @@ static int print_target_list(FILE *f) {
int os_count = target_os_count();
for (int i = 0; i < os_count; i += 1) {
const OsType *os_type = get_target_os(i);
fprintf(f, " %s\n", get_target_os_name(os_type));
const char *native_str = (native_os_type == os_type->llvm_os) ? " (native)" : "";
fprintf(f, " %s%s\n", get_target_os_name(os_type), native_str);
}
fprintf(f, "\nABIs:\n");
int environ_count = target_environ_count();
for (int i = 0; i < environ_count; i += 1) {
const EnvironmentType *environ_type = get_target_environ(i);
fprintf(f, " %s\n", ZigLLVMGetEnvironmentTypeName(environ_type->llvm_environment));
const char *native_str = (native_environ_type == environ_type->llvm_environment) ? " (native)" : "";
fprintf(f, " %s%s\n", ZigLLVMGetEnvironmentTypeName(environ_type->llvm_environment), native_str);
}
return EXIT_SUCCESS;

View File

@ -536,6 +536,21 @@ const char *ZigLLVMGetEnvironmentTypeName(ZigLLVM_EnvironmentType environ) {
return Triple::getEnvironmentTypeName((Triple::EnvironmentType)environ);
}
void ZigLLVMGetNativeTarget(ZigLLVM_ArchType *arch_type, ZigLLVM_SubArchType *sub_arch_type,
ZigLLVM_VendorType *vendor_type, ZigLLVM_OSType *os_type, ZigLLVM_EnvironmentType *environ_type)
{
char *native_triple = LLVMGetDefaultTargetTriple();
Triple triple(native_triple);
*arch_type = (ZigLLVM_ArchType)triple.getArch();
*sub_arch_type = (ZigLLVM_SubArchType)triple.getSubArch();
*vendor_type = (ZigLLVM_VendorType)triple.getVendor();
*os_type = (ZigLLVM_OSType)triple.getOS();
*environ_type = (ZigLLVM_EnvironmentType)triple.getEnvironment();
free(native_triple);
}
//------------------------------------
#include "buffer.hpp"

View File

@ -288,6 +288,9 @@ const char *ZigLLVMGetVendorTypeName(ZigLLVM_VendorType vendor);
const char *ZigLLVMGetOSTypeName(ZigLLVM_OSType os);
const char *ZigLLVMGetEnvironmentTypeName(ZigLLVM_EnvironmentType environ);
void ZigLLVMGetNativeTarget(ZigLLVM_ArchType *arch_type, ZigLLVM_SubArchType *sub_arch_type,
ZigLLVM_VendorType *vendor_type, ZigLLVM_OSType *os_type, ZigLLVM_EnvironmentType *environ_type);
/*
* This stuff is not LLVM API but it depends on the LLVM C++ API so we put it here.