From 7784ebc239202bba4859855c3f438319144535f0 Mon Sep 17 00:00:00 2001 From: Anton Korobeynikov Date: Thu, 30 Nov 2006 22:42:55 +0000 Subject: [PATCH] Factor out GVRequiresExtraLoad() from .h to .cpp git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@32048 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/X86/X86Subtarget.cpp | 17 +++++++++++++++++ lib/Target/X86/X86Subtarget.h | 15 ++------------- 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/lib/Target/X86/X86Subtarget.cpp b/lib/Target/X86/X86Subtarget.cpp index ea185b98e82..2459ed122c0 100644 --- a/lib/Target/X86/X86Subtarget.cpp +++ b/lib/Target/X86/X86Subtarget.cpp @@ -27,6 +27,23 @@ AsmWriterFlavor("x86-asm-syntax", cl::init(X86Subtarget::unset), clEnumValEnd)); +/// True if accessing the GV requires an extra load. For Windows, dllimported +/// symbols are indirect, loading the value at address GV rather then the +/// value of GV itself. This means that the GlobalAddress must be in the base +/// or index register of the address, not the GV offset field. +bool X86Subtarget::GVRequiresExtraLoad(const GlobalValue* GV, bool isDirectCall) const +{ + if (isTargetDarwin()) { + return (!isDirectCall && + (GV->hasWeakLinkage() || GV->hasLinkOnceLinkage() || + (GV->isExternal() && !GV->hasNotBeenReadFromBytecode()))); + } else if (isTargetCygwin() || isTargetWindows()) { + return (GV->hasDLLImportLinkage()); + } + + return false; +} + /// GetCpuIDAndInfo - Execute the specified cpuid and return the 4 values in the /// specified arguments. If we can't run cpuid on the host, return true. bool X86::GetCpuIDAndInfo(unsigned value, unsigned *rEAX, unsigned *rEBX, diff --git a/lib/Target/X86/X86Subtarget.h b/lib/Target/X86/X86Subtarget.h index c52979711da..70e70e90110 100644 --- a/lib/Target/X86/X86Subtarget.h +++ b/lib/Target/X86/X86Subtarget.h @@ -14,13 +14,13 @@ #ifndef X86SUBTARGET_H #define X86SUBTARGET_H -#include "llvm/GlobalValue.h" #include "llvm/Target/TargetSubtarget.h" #include namespace llvm { class Module; +class GlobalValue; class X86Subtarget : public TargetSubtarget { public: @@ -111,18 +111,7 @@ public: /// symbols are indirect, loading the value at address GV rather then the /// value of GV itself. This means that the GlobalAddress must be in the base /// or index register of the address, not the GV offset field. - bool GVRequiresExtraLoad(const GlobalValue* GV, bool isDirectCall) const - { - if (isTargetDarwin()) { - return (!isDirectCall && - (GV->hasWeakLinkage() || GV->hasLinkOnceLinkage() || - (GV->isExternal() && !GV->hasNotBeenReadFromBytecode()))); - } else if (isTargetCygwin() || isTargetWindows()) { - return (GV->hasDLLImportLinkage()); - } - - return false; - } + bool GVRequiresExtraLoad(const GlobalValue* GV, bool isDirectCall) const; }; namespace X86 {