llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-ir
Author: Dominik Steenken (dominik-steenken)
<details>
<summary>Changes</summary>
When creating global strings, some targets have requirements that need to be
taken into account. Previously, the global strings created by
`IRBuilder::createGlobalString` had a hard-coded alignment of `1`.
This commit makes it so that the alignment is taken from the data layout
instead, giving targets the chance to align global strings according to their
preferences.
This PR is motivated by (and should fix) #<!-- -->141491, where the 1-byte
alignment in a global string created by a `printf` optimization led to the
resulting assembly in a `-fno-PIC` compile to unexpectedly reference the GOT
based on whether the code contained `printf` statements of the form
`printf("foo\n");`.
I don't know and would appreciate feedback on whether this is the correct place
to fix something like that.
---
Full diff: https://github.com/llvm/llvm-project/pull/142346.diff
2 Files Affected:
- (added) clang/test/CodeGen/SystemZ/align-systemz-globalstring.c (+14)
- (modified) llvm/lib/IR/IRBuilder.cpp (+1-1)
``````````diff
diff --git a/clang/test/CodeGen/SystemZ/align-systemz-globalstring.c
b/clang/test/CodeGen/SystemZ/align-systemz-globalstring.c
new file mode 100644
index 0000000000000..f5178a079f898
--- /dev/null
+++ b/clang/test/CodeGen/SystemZ/align-systemz-globalstring.c
@@ -0,0 +1,14 @@
+// RUN: %clang_cc1 -O1 -triple s390x-linux-gnu -emit-llvm %s -o - | FileCheck
%s
+
+// #include <stdio.h>
+
+// CHECK: @msg1 = local_unnamed_addr constant [13 x i8] c"Hello World\0A\00",
align 2
+// CHECK: @str = private unnamed_addr constant [12 x i8] c"Hello World\00",
align 2
+
+const char msg1 [] = "Hello World\n";
+
+extern int printf(const char *__restrict __format, ...);
+
+void foo() {
+ printf(msg1);
+}
\ No newline at end of file
diff --git a/llvm/lib/IR/IRBuilder.cpp b/llvm/lib/IR/IRBuilder.cpp
index 580b0af709337..ab06a587a861f 100644
--- a/llvm/lib/IR/IRBuilder.cpp
+++ b/llvm/lib/IR/IRBuilder.cpp
@@ -52,7 +52,7 @@ GlobalVariable *IRBuilderBase::CreateGlobalString(StringRef
Str,
*M, StrConstant->getType(), true, GlobalValue::PrivateLinkage,
StrConstant, Name, nullptr, GlobalVariable::NotThreadLocal,
AddressSpace);
GV->setUnnamedAddr(GlobalValue::UnnamedAddr::Global);
- GV->setAlignment(Align(1));
+ GV->setAlignment(M->getDataLayout().getPreferredAlign(GV));
return GV;
}
``````````
</details>
https://github.com/llvm/llvm-project/pull/142346
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits