gollvm: update recipe for recording sret/byval arg attributes Update the recipe for attaching "sret" (structure return) and "by value" attributes to function parameters. Previously it was enough to just apply these attributes as tags; now we need to also capture the type of the return or param as well. Also fixes a buglet in the unit test remastering machinery (incorrect env variable name). Fixes golang/go#42843. Change-Id: I3fceff4868f714d97621bdca07b91513c2ba94c8 Reviewed-on: https://go-review.googlesource.com/c/gollvm/+/274833 Trust: Than McIntosh <thanm@google.com> Reviewed-by: Cherry Zhang <cherryyz@google.com>
diff --git a/bridge/go-llvm-bfunction.cpp b/bridge/go-llvm-bfunction.cpp index 5d1f78d..fc80e99 100644 --- a/bridge/go-llvm-bfunction.cpp +++ b/bridge/go-llvm-bfunction.cpp
@@ -106,7 +106,9 @@ if (abiOracle_->returnInfo().disp() == ParmIndirect) { std::string sretname(namegen("sret.formal")); arguments_[argIdx]->setName(sretname); - arguments_[argIdx]->addAttr(llvm::Attribute::StructRet); + llvm::AttrBuilder SRETAttrs; + SRETAttrs.addStructRetAttr(fcnType_->resultType()->type()); + arguments_[argIdx]->addAttrs(SRETAttrs); rtnValueMem_ = arguments_[argIdx]; argIdx += 1; } @@ -137,8 +139,11 @@ case ParmIndirect: { paramValues_.push_back(arguments_[argIdx]); assert(paramInfo.numArgSlots() == 1); - if (paramInfo.attr() == AttrByVal) - arguments_[argIdx]->addAttr(llvm::Attribute::ByVal); + if (paramInfo.attr() == AttrByVal) { + llvm::AttrBuilder BVAttrs; + BVAttrs.addByValAttr(paramTypes[idx]->type()); + arguments_[argIdx]->addAttrs(BVAttrs); + } argIdx += 1; break; }
diff --git a/unittests/BackendCore/BackendDebugEmit.cpp b/unittests/BackendCore/BackendDebugEmit.cpp index 622718d..38e98de 100644 --- a/unittests/BackendCore/BackendDebugEmit.cpp +++ b/unittests/BackendCore/BackendDebugEmit.cpp
@@ -76,12 +76,11 @@ EXPECT_FALSE(broken && "Module failed to verify."); DECLARE_EXPECTED_OUTPUT(exp, R"RAW_RESULT( - define void @foo(i8* nest %nest.0, { i64, i64, i64 }* byval %p0) #0 { - entry: - call void @llvm.dbg.declare(metadata { i64, i64, i64 }* %p0, metadata !5, - metadata !DIExpression()), !dbg !18 - ret void - } + define void @foo(i8* nest %nest.0, { i64, i64, i64 }* byval({ i64, i64, i64 }) %p0) #0 { + entry: + call void @llvm.dbg.declare(metadata { i64, i64, i64 }* %p0, metadata !5, metadata !DIExpression()), !dbg !18 + ret void + } )RAW_RESULT"); bool isOK = h.expectValue(func->function(), exp);
diff --git a/unittests/BackendCore/BackendExprTests.cpp b/unittests/BackendCore/BackendExprTests.cpp index 54b37da..5d7528f 100644 --- a/unittests/BackendCore/BackendExprTests.cpp +++ b/unittests/BackendCore/BackendExprTests.cpp
@@ -1455,7 +1455,7 @@ h.mkLocal("a", s2t, cond); DECLARE_EXPECTED_OUTPUT(exp, R"RAW_RESULT( - define void @foo({ [16 x i32], i32 }* sret %sret.formal.0, i8* nest %nest.0, { [16 x i32], i32 }* byval %p0, i32 %p1) #0 { + define void @foo({ [16 x i32], i32 }* sret({ [16 x i32], i32 }) %sret.formal.0, i8* nest %nest.0, { [16 x i32], i32 }* byval({ [16 x i32], i32 }) %p0, i32 %p1) #0 { entry: %p1.addr = alloca i32, align 4 %a = alloca { [16 x i32], i32 }, align 4 @@ -1530,7 +1530,7 @@ h.mkLocal("a", s2t, cond); DECLARE_EXPECTED_OUTPUT(exp, R"RAW_RESULT( - define void @foo({ [16 x i32], i32 }* sret %sret.formal.0, i8* nest %nest.0, { [16 x i32], i32 }* %p0, i32 %p1) #0 { + define void @foo({ [16 x i32], i32 }* sret({ [16 x i32], i32 }) %sret.formal.0, i8* nest %nest.0, { [16 x i32], i32 }* %p0, i32 %p1) #0 { entry: %p1.addr = alloca i32, align 4 %a = alloca { [16 x i32], i32 }, align 4
diff --git a/unittests/TestUtils/DiffUtils.cpp b/unittests/TestUtils/DiffUtils.cpp index b3295f4..98786d7 100644 --- a/unittests/TestUtils/DiffUtils.cpp +++ b/unittests/TestUtils/DiffUtils.cpp
@@ -168,7 +168,7 @@ if (getenv("GOLLVM_UNITTESTS_BACKENDCORE_EMITDUMPFILES") != nullptr) emitDumpFilesOnDiff = true; - if (getenv("GOLLVM_UNITTESTS_BACKENDCORE_EMITDUMPFILES") != nullptr) { + if (getenv("GOLLVM_UNITTESTS_EMIT_REMASTER_SCRIPT") != nullptr) { emitRemasterScript = true; emitDumpFilesOnDiff = true; }