diff options
author | Peter Collingbourne <peter@pcc.me.uk> | 2011-02-18 02:24:56 +0000 |
---|---|---|
committer | Peter Collingbourne <peter@pcc.me.uk> | 2011-02-18 02:24:56 +0000 |
commit | ef9a1d0e13662162aa8cdae8732c33b5d751d80c (patch) | |
tree | aae8af3971935ac06d8ec0670bbb7d123940852b /lib/CodeGen | |
parent | 8f5667d06a785719691c1139b961411d7f0aedf5 (diff) |
Move TargetInfo::adjustInlineAsmType to TargetCodeGenInfo
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@125819 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen')
-rw-r--r-- | lib/CodeGen/CGStmt.cpp | 9 | ||||
-rw-r--r-- | lib/CodeGen/TargetInfo.cpp | 22 | ||||
-rw-r--r-- | lib/CodeGen/TargetInfo.h | 9 |
3 files changed, 36 insertions, 4 deletions
diff --git a/lib/CodeGen/CGStmt.cpp b/lib/CodeGen/CGStmt.cpp index f809c009ce..cd238112ed 100644 --- a/lib/CodeGen/CGStmt.cpp +++ b/lib/CodeGen/CGStmt.cpp @@ -14,6 +14,7 @@ #include "CGDebugInfo.h" #include "CodeGenModule.h" #include "CodeGenFunction.h" +#include "TargetInfo.h" #include "clang/AST/StmtVisitor.h" #include "clang/Basic/PrettyStackTrace.h" #include "clang/Basic/TargetInfo.h" @@ -1135,8 +1136,8 @@ void CodeGenFunction::EmitAsmStmt(const AsmStmt &S) { } } if (const llvm::Type* AdjTy = - Target.adjustInlineAsmType(OutputConstraint, ResultRegTypes.back(), - getLLVMContext())) + getTargetHooks().adjustInlineAsmType(*this, OutputConstraint, + ResultRegTypes.back())) ResultRegTypes.back() = AdjTy; } else { ArgTypes.push_back(Dest.getAddress()->getType()); @@ -1207,8 +1208,8 @@ void CodeGenFunction::EmitAsmStmt(const AsmStmt &S) { } } if (const llvm::Type* AdjTy = - Target.adjustInlineAsmType(InputConstraint, Arg->getType(), - getLLVMContext())) + getTargetHooks().adjustInlineAsmType(*this, InputConstraint, + Arg->getType())) Arg = Builder.CreateBitCast(Arg, AdjTy); ArgTypes.push_back(Arg->getType()); diff --git a/lib/CodeGen/TargetInfo.cpp b/lib/CodeGen/TargetInfo.cpp index 881a7ee4d0..f95aab0744 100644 --- a/lib/CodeGen/TargetInfo.cpp +++ b/lib/CodeGen/TargetInfo.cpp @@ -355,6 +355,14 @@ bool UseX86_MMXType(const llvm::Type *IRType) { IRType->getScalarSizeInBits() != 64; } +static const llvm::Type* X86AdjustInlineAsmType(CodeGen::CodeGenFunction &CGF, + llvm::StringRef Constraint, + const llvm::Type* Ty) { + if (Constraint=="y" && UseX86_MMXType(Ty)) + return llvm::Type::getX86_MMXTy(CGF.getLLVMContext()); + return Ty; +} + //===----------------------------------------------------------------------===// // X86-32 ABI Implementation //===----------------------------------------------------------------------===// @@ -415,6 +423,13 @@ public: bool initDwarfEHRegSizeTable(CodeGen::CodeGenFunction &CGF, llvm::Value *Address) const; + + const llvm::Type* adjustInlineAsmType(CodeGen::CodeGenFunction &CGF, + llvm::StringRef Constraint, + const llvm::Type* Ty) const { + return X86AdjustInlineAsmType(CGF, Constraint, Ty); + } + }; } @@ -895,6 +910,13 @@ public: return false; } + + const llvm::Type* adjustInlineAsmType(CodeGen::CodeGenFunction &CGF, + llvm::StringRef Constraint, + const llvm::Type* Ty) const { + return X86AdjustInlineAsmType(CGF, Constraint, Ty); + } + }; class WinX86_64TargetCodeGenInfo : public TargetCodeGenInfo { diff --git a/lib/CodeGen/TargetInfo.h b/lib/CodeGen/TargetInfo.h index 9d4cf16103..4f59eb619e 100644 --- a/lib/CodeGen/TargetInfo.h +++ b/lib/CodeGen/TargetInfo.h @@ -15,8 +15,11 @@ #ifndef CLANG_CODEGEN_TARGETINFO_H #define CLANG_CODEGEN_TARGETINFO_H +#include "llvm/ADT/StringRef.h" + namespace llvm { class GlobalValue; + class Type; class Value; } @@ -102,6 +105,12 @@ namespace clang { llvm::Value *Address) const { return Address; } + + virtual const llvm::Type* adjustInlineAsmType(CodeGen::CodeGenFunction &CGF, + llvm::StringRef Constraint, + const llvm::Type* Ty) const { + return Ty; + } }; } |