Simplification of libcall like printf->puts must check for RtLibUseGOT metadata.
authorSriraman Tallam <tmsriram@google.com>
Tue, 10 Apr 2018 23:32:36 +0000 (23:32 +0000)
committerSriraman Tallam <tmsriram@google.com>
Tue, 10 Apr 2018 23:32:36 +0000 (23:32 +0000)
With -fno-plt, for example, calls to printf when getting converted to puts
still use the PLT. This patch checks for the metadata "RtLibUseGOT" and
annotates the declaration with the right attributes.

Differential Revision: https://reviews.llvm.org/D45180

llvm-svn: 329768

llvm/lib/Transforms/Utils/BuildLibCalls.cpp
llvm/test/CodeGen/X86/no-plt-libcalls.ll [new file with mode: 0644]

index d4cf03c..24af7c4 100644 (file)
@@ -105,12 +105,23 @@ static bool setRetNonNull(Function &F) {
   return true;
 }
 
+static bool setNonLazyBind(Function &F) {
+  if (F.hasFnAttribute(Attribute::NonLazyBind))
+    return false;
+  F.addFnAttr(Attribute::NonLazyBind);
+  return true;
+}
+
 bool llvm::inferLibFuncAttributes(Function &F, const TargetLibraryInfo &TLI) {
   LibFunc TheLibFunc;
   if (!(TLI.getLibFunc(F, TheLibFunc) && TLI.has(TheLibFunc)))
     return false;
 
   bool Changed = false;
+
+  if (F.getParent() != nullptr && F.getParent()->getRtLibUseGOT())
+    Changed |= setNonLazyBind(F);
+
   switch (TheLibFunc) {
   case LibFunc_strlen:
   case LibFunc_wcslen:
diff --git a/llvm/test/CodeGen/X86/no-plt-libcalls.ll b/llvm/test/CodeGen/X86/no-plt-libcalls.ll
new file mode 100644 (file)
index 0000000..795ad57
--- /dev/null
@@ -0,0 +1,19 @@
+; Check if "RtLibUseGOT" works correctly when lib calls are simplified.
+; RUN: opt < %s -instcombine -S | FileCheck %s
+
+@percent_s = constant [4 x i8] c"%s\0A\00"
+@hello_world = constant [13 x i8] c"hello world\0A\00"
+declare i32 @printf(i8*, ...)
+define void @printf_call() {
+  %fmt = getelementptr [4 x i8], [4 x i8]* @percent_s, i32 0, i32 0
+  %str = getelementptr [13 x i8], [13 x i8]* @hello_world, i32 0, i32 0
+  call i32 (i8*, ...) @printf(i8* %fmt, i8* %str)
+; CHECK:  call i32 @puts(i8* getelementptr inbounds ([13 x i8], [13 x i8]* @hello_world, i64 0, i64 0))
+  ret void
+}
+
+; CHECK: Function Attrs: nounwind nonlazybind
+; CHECK-NEXT: declare i32 @puts(i8* nocapture readonly)
+
+!llvm.module.flags = !{!0}
+!0 = !{i32 7, !"RtLibUseGOT", i32 1}