Index: llvm/trunk/include/llvm-c/TargetMachine.h =================================================================== --- llvm/trunk/include/llvm-c/TargetMachine.h +++ llvm/trunk/include/llvm-c/TargetMachine.h @@ -137,6 +137,14 @@ disposed with LLVMDisposeMessage. */ char* LLVMGetDefaultTargetTriple(void); +/** Get the host CPU as a string. The result needs to be disposed with + LLVMDisposeMessage. */ +char* LLVMGetHostCPUName(void); + +/** Get the host CPU's features as a string. The result needs to be disposed + with LLVMDisposeMessage. */ +char* LLVMGetHostCPUFeatures(void); + /** Adds the target-specific analysis passes to the pass manager. */ void LLVMAddAnalysisPasses(LLVMTargetMachineRef T, LLVMPassManagerRef PM); Index: llvm/trunk/lib/Target/TargetMachineC.cpp =================================================================== --- llvm/trunk/lib/Target/TargetMachineC.cpp +++ llvm/trunk/lib/Target/TargetMachineC.cpp @@ -18,6 +18,7 @@ #include "llvm/IR/DataLayout.h" #include "llvm/IR/LegacyPassManager.h" #include "llvm/IR/Module.h" +#include "llvm/MC/SubtargetFeature.h" #include "llvm/Support/FileSystem.h" #include "llvm/Support/FormattedStream.h" #include "llvm/Support/Host.h" @@ -237,6 +238,21 @@ return strdup(sys::getDefaultTargetTriple().c_str()); } +char *LLVMGetHostCPUName(void) { + return strdup(sys::getHostCPUName().data()); +} + +char *LLVMGetHostCPUFeatures(void) { + SubtargetFeatures Features; + StringMap HostFeatures; + + if (sys::getHostCPUFeatures(HostFeatures)) + for (auto &F : HostFeatures) + Features.AddFeature(F.first(), F.second); + + return strdup(Features.getString().c_str()); +} + void LLVMAddAnalysisPasses(LLVMTargetMachineRef T, LLVMPassManagerRef PM) { unwrap(PM)->add( createTargetTransformInfoWrapperPass(unwrap(T)->getTargetIRAnalysis()));