diff --git a/include/llvm/Target/SubtargetFeature.h b/include/llvm/Target/SubtargetFeature.h index 89e6efef376..70315df484b 100644 --- a/include/llvm/Target/SubtargetFeature.h +++ b/include/llvm/Target/SubtargetFeature.h @@ -81,6 +81,9 @@ public: /// Set the CPU string. Replaces previous setting. Setting to "" clears CPU. void setCPU(const std::string &String); + /// Get the CPU string. + const std::string &getCPU() const { return Features[0]; } + /// Setting CPU string only if no string is set. void setCPUIfNone(const std::string &String); diff --git a/include/llvm/Target/TargetSubtarget.h b/include/llvm/Target/TargetSubtarget.h index 3b174c2ee46..875008deaf6 100644 --- a/include/llvm/Target/TargetSubtarget.h +++ b/include/llvm/Target/TargetSubtarget.h @@ -14,6 +14,8 @@ #ifndef LLVM_TARGET_TARGETSUBTARGET_H #define LLVM_TARGET_TARGETSUBTARGET_H +#include + namespace llvm { //===----------------------------------------------------------------------===// @@ -25,10 +27,13 @@ namespace llvm { class TargetSubtarget { TargetSubtarget(const TargetSubtarget&); // DO NOT IMPLEMENT void operator=(const TargetSubtarget&); // DO NOT IMPLEMENT + std::string CPU; // CPU name. protected: // Can only create subclasses... TargetSubtarget(); public: virtual ~TargetSubtarget(); + void setCPU(const std::string &C) { CPU = C; } + const std::string &getCPU() const { return CPU; } }; } // End llvm namespace diff --git a/lib/Target/PowerPC/PPCAsmPrinter.cpp b/lib/Target/PowerPC/PPCAsmPrinter.cpp index 032782b8ceb..c84c6fb1598 100644 --- a/lib/Target/PowerPC/PPCAsmPrinter.cpp +++ b/lib/Target/PowerPC/PPCAsmPrinter.cpp @@ -542,8 +542,19 @@ bool DarwinAsmPrinter::runOnMachineFunction(MachineFunction &MF) { bool DarwinAsmPrinter::doInitialization(Module &M) { - if (Subtarget.isGigaProcessor()) + const std::string &CPU = Subtarget.getCPU(); + + if (CPU != "generic") + O << "\t.machine ppc" << CPU << "\n"; + else if (Subtarget.isGigaProcessor()) O << "\t.machine ppc970\n"; + else if (Subtarget.isPPC64()) + O << "\t.machine ppc64\n"; + else if (Subtarget.hasAltivec()) + O << "\t.machine ppc7400\n"; + else + O << "\t.machine ppc\n"; + AsmPrinter::doInitialization(M); // Darwin wants symbols to be quoted if they have complex names. diff --git a/utils/TableGen/SubtargetEmitter.cpp b/utils/TableGen/SubtargetEmitter.cpp index a70dbc97287..caff55c4e30 100644 --- a/utils/TableGen/SubtargetEmitter.cpp +++ b/utils/TableGen/SubtargetEmitter.cpp @@ -460,6 +460,7 @@ void SubtargetEmitter::ParseFeaturesFunction(std::ostream &OS) { " const std::string &CPU) {\n" " SubtargetFeatures Features(FS);\n" " Features.setCPUIfNone(CPU);\n" + " setCPU(Features.getCPU());\n" " uint32_t Bits = Features.getBits(SubTypeKV, SubTypeKVSize,\n" " FeatureKV, FeatureKVSize);\n";