Skip to content

Triples: Environment vs Object format #147665

@mintsuki

Description

@mintsuki

Reproducer:

#include <cstdio>
#include <llvm/ADT/StringRef.h>
#include <llvm/ADT/Twine.h>
#include <llvm/TargetParser/Triple.h>
#include <llvm/TargetParser/TargetParser.h>

#define props(X) \
    X(hasEnvironment) \
    X(isArch64Bit) \
    X(isArch32Bit) \
    X(isArch16Bit) \
    X(isMacOSX) \
    X(isiOS) \
    X(isTvOS) \
    X(isWatchOS) \
    X(isWatchABI) \
    X(isXROS) \
    X(isDriverKit) \
    X(isOSzOS) \
    X(isOSDarwin) \
    X(isSimulatorEnvironment) \
    X(isMacCatalystEnvironment) \
    X(isTargetMachineMac) \
    X(isOSNetBSD) \
    X(isOSOpenBSD) \
    X(isOSFreeBSD) \
    X(isOSFuchsia) \
    X(isOSDragonFly) \
    X(isOSSolaris) \
    X(isOSIAMCU) \
    X(isOSUnknown) \
    X(isGNUEnvironment) \
    X(isOSHaiku) \
    X(isUEFI) \
    X(isOSWindows) \
    X(isKnownWindowsMSVCEnvironment) \
    X(isWindowsMSVCEnvironment) \
    X(isWindowsArm64EC) \
    X(isWindowsCoreCLREnvironment) \
    X(isWindowsItaniumEnvironment) \
    X(isWindowsCygwinEnvironment) \
    X(isWindowsGNUEnvironment) \
    X(isOSCygMing) \
    X(isOSMSVCRT) \
    X(isOSNaCl) \
    X(isOSLinux) \
    X(isOSKFreeBSD) \
    X(isOSHurd) \
    X(isOSWASI) \
    X(isOSEmscripten) \
    X(isOSGlibc) \
    X(isOSAIX) \
    X(isOSSerenity) \
    X(isOSBinFormatELF) \
    X(isOSBinFormatCOFF) \
    X(isOSBinFormatGOFF) \
    X(isOSBinFormatMachO) \
    X(isOSBinFormatWasm) \
    X(isOSBinFormatXCOFF) \
    X(isOSBinFormatDXContainer) \
    X(isPS4) \
    X(isPS5) \
    X(isPS) \
    X(isAndroid) \
    X(isMusl) \
    X(isOHOSFamily) \
    X(isOpenHOS) \
    X(isOSLiteOS) \
    X(isDXIL) \
    X(isShaderModelOS) \
    X(isVulkanOS) \
    X(isShaderStageEnvironment) \
    X(isSPIR) \
    X(isSPIRV) \
    X(isSPIRVLogical) \
    X(isNVPTX) \
    X(isAMDGCN) \
    X(isAMDGPU) \
    X(isThumb) \
    X(isARM) \
    X(isTargetEHABICompatible) \
    X(isArmT32) \
    X(isArmMClass) \
    X(isAArch64) \
    X(isLoongArch32) \
    X(isLoongArch64) \
    X(isLoongArch) \
    X(isMIPS32) \
    X(isMIPS64) \
    X(isMIPS) \
    X(isPPC) \
    X(isPPC32) \
    X(isPPC64) \
    X(isPPC64ELFv2ABI) \
    X(isPPC32SecurePlt) \
    X(isRISCV32) \
    X(isRISCV64) \
    X(isRISCV) \
    X(isSPARC32) \
    X(isSPARC64) \
    X(isSPARC) \
    X(isSystemZ) \
    X(isX86) \
    X(isVE) \
    X(isWasm) \
    X(isCSKY) \
    X(isArm64e) \
    X(isX32) \
    X(isBPF) \
    X(supportsCOMDAT) \
    X(hasDefaultEmulatedTLS) \
    X(hasDefaultTLSDESC) \
    X(hasDefaultDataSections) \
    X(hasDLLImportExport) \
    X(isLittleEndian)

#define handleProp(P) if (triple.P()) printf(" %s", #P);

const char* rstr(llvm::StringRef r) {
    if (r.size() == 0) return "(empty)";
    char* dst = (char*)malloc(r.size() + 1);
    memcpy(dst, r.begin(), r.size());
    dst[r.size()] = 0;
    return dst;
}

int main(int argc, char** argv) {
    if (argc != 2) {
        printf("Usage: %s <triple>\n", argv[0]);
        return 1;
    }
    std::string normal = llvm::Triple::normalize(argv[1]);
    printf("normalize %s -> %s\n", argv[1], normal.c_str());
    llvm::Triple triple{normal};
    printf("arch: %s\n", rstr(triple.getArchTypeName(triple.getArch())));
    printf("vendor: %s\n", rstr(triple.getVendorTypeName(triple.getVendor())));
    printf("OS: %s\n", rstr(triple.getOSTypeName(triple.getOS())));
    printf("env: %s\n", rstr(triple.getEnvironmentTypeName(triple.getEnvironment())));
    printf("object format: %s\n", rstr(triple.getObjectFormatTypeName(triple.getObjectFormat())));
    props(handleProp);
    printf("\n");
}

Hello,

Consider a target triple such as x86_64-unknown-unknown-elf.

elf will be considered the object format for the final, normalised Triple object, but hasEnvironment() will return true, despite there not being a clear environment set.

-elf does not set a valid environment, as one can see from triple.getEnvironmentTypeName(triple.getEnvironment()) returning unknown. I understand that the environment and object format fields go in the same component of the triple, but in this case there is only an object format, not an environment.

Is this a misunderstanding of mine, or is this a bug with the normalisation/parsing of triples? In my opinion, hasEnvironment() should return false as -elf does not contain an environment at all, but rather just an object format.

Metadata

Metadata

Assignees

No one assigned

    Labels

    questionA question, not bug report. Check out https://llvm.org/docs/GettingInvolved.html instead!

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions