Add support for llvm.constant with StringAttr as value.
authorStephan Herhut <herhut@google.com>
Fri, 24 May 2019 11:49:56 +0000 (04:49 -0700)
committerMehdi Amini <joker.eph@gmail.com>
Sun, 2 Jun 2019 02:59:54 +0000 (19:59 -0700)
    These are translated to an llvm::ConstantDataArray on translation to llvm IR
    proper.

--

PiperOrigin-RevId: 249813111

mlir/lib/Target/LLVMIR/ModuleTranslation.cpp
mlir/test/Target/llvmir.mlir

index ff3d6b0..533c1ef 100644 (file)
@@ -110,6 +110,11 @@ llvm::Constant *ModuleTranslation::getLLVMConstant(llvm::Type *llvmType,
     }
     return llvm::ConstantVector::get(constants);
   }
+  if (auto stringAttr = attr.dyn_cast<StringAttr>()) {
+    return llvm::ConstantDataArray::get(
+        llvmModule->getContext(), ArrayRef<char>{stringAttr.getValue().data(),
+                                                 stringAttr.getValue().size()});
+  }
   mlirModule.getContext()->emitError(loc, "unsupported constant value");
   return nullptr;
 }
index fca0475..36641b3 100644 (file)
@@ -819,3 +819,9 @@ func @intpointerconversion(%arg0 : !llvm.i32) -> !llvm.i32 {
   llvm.return %2 : !llvm.i32
 }
 
+func @stringconstant() -> !llvm<"i8*"> {
+  %1 = llvm.constant("Hello world!") : !llvm<"i8*">
+  // CHECK: ret [12 x i8] c"Hello world!"
+  llvm.return %1 : !llvm<"i8*">
+}
+