summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
diff options
context:
space:
mode:
authorTim Northover <tnorthover@apple.com>2017-03-09 23:36:26 +0000
committerTim Northover <tnorthover@apple.com>2017-03-09 23:36:26 +0000
commitaa995c98f4c36e7d0a4f7f302c330e8c655c34ea (patch)
tree16a7a7ff5fac5566add5e87a5877467189e8a899 /llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
parent93f47e5ffb1b16a776a10f40558db38370dea894 (diff)
downloadbcm5719-llvm-aa995c98f4c36e7d0a4f7f302c330e8c655c34ea.tar.gz
bcm5719-llvm-aa995c98f4c36e7d0a4f7f302c330e8c655c34ea.zip
GlobalISel: support trivial inlineasm calls.
They're used for nefarious purposes by ObjC. llvm-svn: 297422
Diffstat (limited to 'llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp')
-rw-r--r--llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp21
1 files changed, 20 insertions, 1 deletions
diff --git a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
index e170b762ab8..b2ab3c12bc1 100644
--- a/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/IRTranslator.cpp
@@ -715,13 +715,32 @@ bool IRTranslator::translateKnownIntrinsic(const CallInst &CI, Intrinsic::ID ID,
return false;
}
+bool IRTranslator::translateInlineAsm(const CallInst &CI,
+ MachineIRBuilder &MIRBuilder) {
+ const InlineAsm &IA = cast<InlineAsm>(*CI.getCalledValue());
+ if (!IA.getConstraintString().empty())
+ return false;
+
+ unsigned ExtraInfo = 0;
+ if (IA.hasSideEffects())
+ ExtraInfo |= InlineAsm::Extra_HasSideEffects;
+ if (IA.getDialect() == InlineAsm::AD_Intel)
+ ExtraInfo |= InlineAsm::Extra_AsmDialect;
+
+ MIRBuilder.buildInstr(TargetOpcode::INLINEASM)
+ .addExternalSymbol(IA.getAsmString().c_str())
+ .addImm(ExtraInfo);
+
+ return true;
+}
+
bool IRTranslator::translateCall(const User &U, MachineIRBuilder &MIRBuilder) {
const CallInst &CI = cast<CallInst>(U);
auto TII = MF->getTarget().getIntrinsicInfo();
const Function *F = CI.getCalledFunction();
if (CI.isInlineAsm())
- return false;
+ return translateInlineAsm(CI, MIRBuilder);
if (!F || !F->isIntrinsic()) {
unsigned Res = CI.getType()->isVoidTy() ? 0 : getOrCreateVReg(CI);
OpenPOWER on IntegriCloud