summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJim Grosbach <grosbach@apple.com>2013-11-16 00:52:57 +0000
committerJim Grosbach <grosbach@apple.com>2013-11-16 00:52:57 +0000
commit35de9946d5fc01d2fed970bdcc7966bad92bdbc4 (patch)
tree7f83902af26e06269d278695f2ee8215454a65e3
parent07df65cbb1d9183aa29cb17be2edaf67fbfec42a (diff)
downloadllvm-35de9946d5fc01d2fed970bdcc7966bad92bdbc4.tar.gz
llvm-35de9946d5fc01d2fed970bdcc7966bad92bdbc4.tar.bz2
llvm-35de9946d5fc01d2fed970bdcc7966bad92bdbc4.tar.xz
X86: Encode the 'h' cpu subtype in the MachO header for x86.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@194906 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/llvm/Support/MachO.h3
-rw-r--r--lib/Support/Triple.cpp2
-rw-r--r--lib/Target/X86/MCTargetDesc/X86AsmBackend.cpp20
3 files changed, 17 insertions, 8 deletions
diff --git a/include/llvm/Support/MachO.h b/include/llvm/Support/MachO.h
index dcf9e423f0..897a6112f5 100644
--- a/include/llvm/Support/MachO.h
+++ b/include/llvm/Support/MachO.h
@@ -948,7 +948,8 @@ namespace llvm {
CPU_SUBTYPE_X86_ALL = 3,
CPU_SUBTYPE_X86_64_ALL = 3,
- CPU_SUBTYPE_X86_ARCH1 = 4
+ CPU_SUBTYPE_X86_ARCH1 = 4,
+ CPU_SUBTYPE_X86_64_H = 8
};
static inline int CPU_SUBTYPE_INTEL(int Family, int Model) {
return Family | (Model << 4);
diff --git a/lib/Support/Triple.cpp b/lib/Support/Triple.cpp
index d0d0e14fce..6c978a0244 100644
--- a/lib/Support/Triple.cpp
+++ b/lib/Support/Triple.cpp
@@ -221,7 +221,7 @@ static Triple::ArchType parseArch(StringRef ArchName) {
.Cases("i386", "i486", "i586", "i686", Triple::x86)
// FIXME: Do we need to support these?
.Cases("i786", "i886", "i986", Triple::x86)
- .Cases("amd64", "x86_64", Triple::x86_64)
+ .Cases("amd64", "x86_64", "x86_64h", Triple::x86_64)
.Case("powerpc", Triple::ppc)
.Cases("powerpc64", "ppu", Triple::ppc64)
.Case("powerpc64le", Triple::ppc64le)
diff --git a/lib/Target/X86/MCTargetDesc/X86AsmBackend.cpp b/lib/Target/X86/MCTargetDesc/X86AsmBackend.cpp
index 79605427c4..c1a710be5c 100644
--- a/lib/Target/X86/MCTargetDesc/X86AsmBackend.cpp
+++ b/lib/Target/X86/MCTargetDesc/X86AsmBackend.cpp
@@ -9,6 +9,7 @@
#include "MCTargetDesc/X86BaseInfo.h"
#include "MCTargetDesc/X86FixupKinds.h"
+#include "llvm/ADT/StringSwitch.h"
#include "llvm/MC/MCAsmBackend.h"
#include "llvm/MC/MCAssembler.h"
#include "llvm/MC/MCELFObjectWriter.h"
@@ -732,17 +733,19 @@ public:
class DarwinX86_64AsmBackend : public DarwinX86AsmBackend {
bool SupportsCU;
+ const MachO::CPUSubTypeX86 Subtype;
public:
DarwinX86_64AsmBackend(const Target &T, const MCRegisterInfo &MRI,
- StringRef CPU, bool SupportsCU)
- : DarwinX86AsmBackend(T, MRI, CPU, true), SupportsCU(SupportsCU) {
+ StringRef CPU, bool SupportsCU,
+ MachO::CPUSubTypeX86 st)
+ : DarwinX86AsmBackend(T, MRI, CPU, true), SupportsCU(SupportsCU),
+ Subtype(st) {
HasReliableSymbolDifference = true;
}
MCObjectWriter *createObjectWriter(raw_ostream &OS) const {
return createX86MachObjectWriter(OS, /*Is64Bit=*/true,
- MachO::CPU_TYPE_X86_64,
- MachO::CPU_SUBTYPE_X86_64_ALL);
+ MachO::CPU_TYPE_X86_64, Subtype);
}
virtual bool doesSectionRequireSymbols(const MCSection &Section) const {
@@ -811,10 +814,15 @@ MCAsmBackend *llvm::createX86_64AsmBackend(const Target &T,
StringRef CPU) {
Triple TheTriple(TT);
- if (TheTriple.isOSDarwin() || TheTriple.getEnvironment() == Triple::MachO)
+ if (TheTriple.isOSDarwin() || TheTriple.getEnvironment() == Triple::MachO) {
+ MachO::CPUSubTypeX86 CS =
+ StringSwitch<MachO::CPUSubTypeX86>(TheTriple.getArchName())
+ .Case("x86_64h", MachO::CPU_SUBTYPE_X86_64_H)
+ .Default(MachO::CPU_SUBTYPE_X86_64_ALL);
return new DarwinX86_64AsmBackend(T, MRI, CPU,
TheTriple.isMacOSX() &&
- !TheTriple.isMacOSXVersionLT(10, 7));
+ !TheTriple.isMacOSXVersionLT(10, 7), CS);
+ }
if (TheTriple.isOSWindows() && TheTriple.getEnvironment() != Triple::ELF)
return new WindowsX86AsmBackend(T, true, CPU);