add support for prefix/suffix strings to go around GlobalValue(s)
authorDuraid Madina <duraid@octopus.com.au>
Sat, 2 Apr 2005 12:21:51 +0000 (12:21 +0000)
committerDuraid Madina <duraid@octopus.com.au>
Sat, 2 Apr 2005 12:21:51 +0000 (12:21 +0000)
(which may or be function pointers) in the asmprinter. For the moment,
this changes nothing, except the IA64 backend which can use this to write:

  data8.ua  @fptr(blah__blah__mangled_function_name)

  (by setting FunctionAddrPrefix/Suffix to "@fptr(" / ")")

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@21024 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CodeGen/AsmPrinter.h
lib/CodeGen/AsmPrinter.cpp

index 39f309ec4ec95c775727e82e633a085b481ed734..f31b7919d15eb5dd537c10f185d9da6c511e3ba3 100644 (file)
@@ -54,6 +54,21 @@ namespace llvm {
     /// onto all global symbols.  This is often used for "_" or ".".
     const char *GlobalPrefix;    // Defaults to ""
 
+    /// GlobalVarAddrPrefix/Suffix - If these are nonempty, these strings
+    /// will enclose any GlobalVariable (that isn't a function)
+    ///
+    const char *GlobalVarAddrPrefix;       // Defaults to ""
+    const char *GlobalVarAddrSuffix;       // Defaults to ""
+
+    /// FunctionAddrPrefix/Suffix - If these are nonempty, these strings
+    /// will enclose any GlobalVariable that points to a function.
+    /// For example, this is used by the IA64 backend to materialize
+    /// function descriptors, by decorating the ".data8" object with the
+    /// @fptr( ) link-relocation operator.
+    ///
+    const char *FunctionAddrPrefix;       // Defaults to ""
+    const char *FunctionAddrSuffix;       // Defaults to ""
+
     /// ZeroDirective - this should be set to the directive used to get some
     /// number of zero bytes emitted to the current section.  Common cases are
     /// "\t.zero\t" and "\t.space\t".  If this is set to null, the
@@ -87,6 +102,10 @@ namespace llvm {
       : O(o), TM(tm),
         CommentString("#"),
         GlobalPrefix(""),
+       GlobalVarAddrPrefix(""),
+       GlobalVarAddrSuffix(""),
+       FunctionAddrPrefix(""),
+       FunctionAddrSuffix(""),
         ZeroDirective("\t.zero\t"),
         AsciiDirective("\t.ascii\t"),
         Data8bitsDirective("\t.byte\t"),
index 4e77a78d81b1e7a628a1edd790c4d8838645281a..6b4afb7dd8fd4d48fca0a9d5ed7c53c13f33eac8 100644 (file)
@@ -67,11 +67,16 @@ void AsmPrinter::emitConstantValueOnly(const Constant *CV) {
       O << (unsigned long long)CI->getValue();
   else if (const ConstantUInt *CI = dyn_cast<ConstantUInt>(CV))
     O << CI->getValue();
-  else if (isa<GlobalValue>((Value*)CV))
-    // This is a constant address for a global variable or function.  Use the
-    // name of the variable or function as the address value.
-    O << Mang->getValueName(CV);
-  else if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(CV)) {
+  else if (isa<GlobalValue>((Value*)CV)) {
+    // This is a constant address for a global variable or function. Use the
+    // name of the variable or function as the address value, possibly
+    // decorating it with GlobalVarAddrPrefix/Suffix or
+    // FunctionAddrPrefix/Suffix (these all default to "" )
+    if (isa<Function>((Value*)CV))
+      O << FunctionAddrPrefix << Mang->getValueName(CV) << FunctionAddrSuffix;
+    else
+      O << GlobalVarAddrPrefix << Mang->getValueName(CV) << GlobalVarAddrSuffix;
+  } else if (const ConstantExpr *CE = dyn_cast<ConstantExpr>(CV)) {
     const TargetData &TD = TM.getTargetData();
     switch(CE->getOpcode()) {
     case Instruction::GetElementPtr: {