-
Notifications
You must be signed in to change notification settings - Fork 15.1k
Description
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.