[ms-inline asm] Add support for clobbers in CodeGen.
llvm-svn: 161914
This commit is contained in:
parent
222ed4b53a
commit
2d5d1327c4
|
@ -1691,14 +1691,36 @@ void CodeGenFunction::EmitMSAsmStmt(const MSAsmStmt &S) {
|
|||
|
||||
std::vector<llvm::Value*> Args;
|
||||
std::vector<llvm::Type *> ArgTypes;
|
||||
std::string Constraints;
|
||||
|
||||
// Clobbers
|
||||
for (unsigned i = 0, e = S.getNumClobbers(); i != e; ++i) {
|
||||
StringRef Clobber = S.getClobber(i);
|
||||
|
||||
if (Clobber != "memory" && Clobber != "cc")
|
||||
Clobber = Target.getNormalizedGCCRegisterName(Clobber);
|
||||
|
||||
if (i != 0)
|
||||
Constraints += ',';
|
||||
|
||||
Constraints += "~{";
|
||||
Constraints += Clobber;
|
||||
Constraints += '}';
|
||||
}
|
||||
|
||||
// Add machine specific clobbers
|
||||
std::string MachineClobbers = Target.getClobbers();
|
||||
if (!MachineClobbers.empty()) {
|
||||
if (!Constraints.empty())
|
||||
Constraints += ',';
|
||||
Constraints += MachineClobbers;
|
||||
}
|
||||
|
||||
llvm::FunctionType *FTy =
|
||||
llvm::FunctionType::get(VoidTy, ArgTypes, false);
|
||||
|
||||
llvm::InlineAsm *IA =
|
||||
llvm::InlineAsm::get(FTy, *S.getAsmString(), MachineClobbers, true);
|
||||
llvm::InlineAsm::get(FTy, *S.getAsmString(), Constraints, true);
|
||||
llvm::CallInst *Result = Builder.CreateCall(IA, Args);
|
||||
Result->addAttribute(~0, llvm::Attribute::NoUnwind);
|
||||
Result->addAttribute(~0, llvm::Attribute::IANSDialect);
|
||||
|
|
|
@ -29,8 +29,8 @@ void t3() {
|
|||
|
||||
void t4(void) {
|
||||
// CHECK: @t4
|
||||
// CHECK: call void asm sideeffect "mov ebx, eax", "~{dirflag},~{fpsr},~{flags}"() nounwind ia_nsdialect
|
||||
// CHECK: call void asm sideeffect "mov ecx, ebx", "~{dirflag},~{fpsr},~{flags}"() nounwind ia_nsdialect
|
||||
// CHECK: call void asm sideeffect "mov ebx, eax", "~{ebx},~{dirflag},~{fpsr},~{flags}"() nounwind ia_nsdialect
|
||||
// CHECK: call void asm sideeffect "mov ecx, ebx", "~{ecx},~{dirflag},~{fpsr},~{flags}"() nounwind ia_nsdialect
|
||||
// CHECK: ret void
|
||||
__asm mov ebx, eax
|
||||
__asm mov ecx, ebx
|
||||
|
@ -38,8 +38,8 @@ void t4(void) {
|
|||
|
||||
void t5(void) {
|
||||
// CHECK: @t5
|
||||
// CHECK: call void asm sideeffect "mov ebx, eax", "~{dirflag},~{fpsr},~{flags}"() nounwind ia_nsdialect
|
||||
// CHECK: call void asm sideeffect "mov ecx, ebx", "~{dirflag},~{fpsr},~{flags}"() nounwind ia_nsdialect
|
||||
// CHECK: call void asm sideeffect "mov ebx, eax", "~{ebx},~{dirflag},~{fpsr},~{flags}"() nounwind ia_nsdialect
|
||||
// CHECK: call void asm sideeffect "mov ecx, ebx", "~{ecx},~{dirflag},~{fpsr},~{flags}"() nounwind ia_nsdialect
|
||||
// CHECK: ret void
|
||||
__asm mov ebx, eax __asm mov ecx, ebx
|
||||
}
|
||||
|
@ -83,5 +83,5 @@ void t10() {
|
|||
pop ebx
|
||||
}
|
||||
// CHECK: t10
|
||||
// CHECK: call void asm sideeffect "push ebx\0Amov ebx, 0x07\0Apop ebx", "~{dirflag},~{fpsr},~{flags}"() nounwind ia_nsdialect
|
||||
// CHECK: call void asm sideeffect "push ebx\0Amov ebx, 0x07\0Apop ebx", "~{ebx},~{ebx},~{dirflag},~{fpsr},~{flags}"() nounwind ia_nsdialect
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue