aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Gohman <sunfish@mozilla.com>2014-03-05 17:48:22 -0800
committerDan Gohman <sunfish@mozilla.com>2014-03-05 17:48:22 -0800
commit9bef807b3bfa2397fb24f4f9c4df5a633a9717b3 (patch)
treef4a8ca2d8a2a0b4bfa23dd1c3407c2fdfa8bd07b
parentd9003e75353416cfcdb9f03d5fba7e1060a35196 (diff)
Clean up the handling of inline asm.
Make inline asm a report_fatal_error instead of an assertion failure so that it's a little friendlier, and add a test to make sure llc -march=js rejects inline asm. Also disable the PNaCl inline asm("":::"memory") lowering pass. If people are using this, it's best that we diagnose it as it likely isn't portable. There are usually better alternatives.
-rw-r--r--lib/Target/JSBackend/CallHandlers.h4
-rw-r--r--lib/Transforms/NaCl/PNaClABISimplify.cpp2
-rw-r--r--test/CodeGen/JS/asm.ll13
3 files changed, 18 insertions, 1 deletions
diff --git a/lib/Target/JSBackend/CallHandlers.h b/lib/Target/JSBackend/CallHandlers.h
index eefe491d16..bfdd86571c 100644
--- a/lib/Target/JSBackend/CallHandlers.h
+++ b/lib/Target/JSBackend/CallHandlers.h
@@ -1034,7 +1034,9 @@ void setupCallHandlers() {
std::string handleCall(const Instruction *CI) {
const Value *CV = getActuallyCalledValue(CI);
- assert(!isa<InlineAsm>(CV) && "asm() not supported, use EM_ASM() (see emscripten.h)");
+ if (isa<InlineAsm>(CV)) {
+ report_fatal_error("asm() not supported, use EM_ASM() (see emscripten.h)");
+ }
// Get the name to call this function by. If it's a direct call, meaning
// which know which Function we're calling, avoid calling getValueAsStr, as
diff --git a/lib/Transforms/NaCl/PNaClABISimplify.cpp b/lib/Transforms/NaCl/PNaClABISimplify.cpp
index 4deee01a2b..27dd45e1ea 100644
--- a/lib/Transforms/NaCl/PNaClABISimplify.cpp
+++ b/lib/Transforms/NaCl/PNaClABISimplify.cpp
@@ -138,7 +138,9 @@ void llvm::PNaClABISimplifyAddPostOptPasses(PassManager &PM) {
// Remove ``asm("":::"memory")``. This must occur after rewriting
// atomics: a ``fence seq_cst`` surrounded by ``asm("":::"memory")``
// has special meaning and is translated differently.
+#if 0 // XXX EMSCRIPTEN: asm("":::"memory") does't have special semantics.
PM.add(createRemoveAsmMemoryPass());
+#endif
#if 0 // XXX EMSCRIPTEN: PNaCl replaces pointers with ints to simplify their ABI; empscripten doesn't need this.
// ReplacePtrsWithInts assumes that getelementptr instructions and
// ConstantExprs have already been expanded out.
diff --git a/test/CodeGen/JS/asm.ll b/test/CodeGen/JS/asm.ll
new file mode 100644
index 0000000000..41a30431da
--- /dev/null
+++ b/test/CodeGen/JS/asm.ll
@@ -0,0 +1,13 @@
+; RUN: not llc -march=js < %s
+
+; Inline asm isn't supported (yet?). llc should report an error when it
+; encounters inline asm.
+;
+; We could support the special case of an empty inline asm string without much
+; work, but code that uses such things most likely isn't portable anyway, and
+; there are usually much better alternatives.
+
+define void @foo() {
+ call void asm "", ""()
+ ret void
+}