From 05f845314a67f9c30a67e55ce1e3168ff6732ce8 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sat, 23 Jan 2010 04:54:10 +0000 Subject: [PATCH] emit .ascii and .asciz through MCStreamer. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@94282 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/CodeGen/AsmPrinter.h | 4 --- lib/CodeGen/AsmPrinter/AsmPrinter.cpp | 46 +++++++-------------------- test/CodeGen/X86/global-sections.ll | 4 +-- 3 files changed, 14 insertions(+), 40 deletions(-) diff --git a/include/llvm/CodeGen/AsmPrinter.h b/include/llvm/CodeGen/AsmPrinter.h index b45be2752be..f527562564a 100644 --- a/include/llvm/CodeGen/AsmPrinter.h +++ b/include/llvm/CodeGen/AsmPrinter.h @@ -340,10 +340,6 @@ namespace llvm { /// EmitGlobalConstant - Print a general LLVM constant to the .s file. void EmitGlobalConstant(const Constant* CV, unsigned AddrSpace = 0); - /// EmitString - Emit a zero-byte-terminated string constant. - /// - virtual void EmitString(const ConstantArray *CVA) const; - protected: /// EmitConstantValueOnly - Print out the specified constant, without a /// storage class. Only constants of first-class type are allowed here. diff --git a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp index 50842078b46..f6b6307c2f2 100644 --- a/lib/CodeGen/AsmPrinter/AsmPrinter.cpp +++ b/lib/CodeGen/AsmPrinter/AsmPrinter.cpp @@ -683,6 +683,7 @@ void AsmPrinter::EmitInt64(uint64_t Value) const { OutStreamer.EmitIntValue(Value, 8, 0/*addrspace*/); } + /// toOctal - Convert the low order bits of X into an octal digit. /// static inline char toOctal(int X) { @@ -900,45 +901,22 @@ void AsmPrinter::EmitConstantValueOnly(const Constant *CV) { } } -/// printAsCString - Print the specified array as a C compatible string, only if -/// the predicate isString is true. -/// -static void printAsCString(formatted_raw_ostream &O, const ConstantArray *CVA, - unsigned LastElt) { - assert(CVA->isString() && "Array is not string compatible!"); - - O << '\"'; - for (unsigned i = 0; i != LastElt; ++i) { - unsigned char C = - (unsigned char)cast(CVA->getOperand(i))->getZExtValue(); - printStringChar(O, C); - } - O << '\"'; -} - -/// EmitString - Emit a zero-byte-terminated string constant. -/// -void AsmPrinter::EmitString(const ConstantArray *CVA) const { - unsigned NumElts = CVA->getNumOperands(); - if (MAI->getAscizDirective() && NumElts && - cast(CVA->getOperand(NumElts-1))->getZExtValue() == 0) { - O << MAI->getAscizDirective(); - printAsCString(O, CVA, NumElts-1); - } else { - O << MAI->getAsciiDirective(); - printAsCString(O, CVA, NumElts); - } - O << '\n'; -} - static void EmitGlobalConstantArray(const ConstantArray *CA, unsigned AddrSpace, AsmPrinter &AP) { - if (AddrSpace == 0 && CA->isString()) { - AP.EmitString(CA); - } else { // Not a string. Print the values in successive locations + if (AddrSpace != 0 || !CA->isString()) { + // Not a string. Print the values in successive locations for (unsigned i = 0, e = CA->getNumOperands(); i != e; ++i) AP.EmitGlobalConstant(CA->getOperand(i), AddrSpace); + return; } + + // Otherwise, it can be emitted as .ascii. + SmallVector TmpVec; + TmpVec.reserve(CA->getNumOperands()); + for (unsigned i = 0, e = CA->getNumOperands(); i != e; ++i) + TmpVec.push_back(cast(CA->getOperand(i))->getZExtValue()); + + AP.OutStreamer.EmitBytes(StringRef(TmpVec.data(), TmpVec.size()), AddrSpace); } static void EmitGlobalConstantVector(const ConstantVector *CV, diff --git a/test/CodeGen/X86/global-sections.ll b/test/CodeGen/X86/global-sections.ll index b6caa4f27f7..1a7b5777ae8 100644 --- a/test/CodeGen/X86/global-sections.ll +++ b/test/CodeGen/X86/global-sections.ll @@ -75,14 +75,14 @@ ; LINUX: .section .gnu.linkonce.r.G6,"a",@progbits ; LINUX: .weak G6 ; LINUX: G6: -; LINUX: .ascii "\001" +; LINUX: .byte 1 ; LINUX: .size G6, 1 ; DARWIN: .section __TEXT,__const_coal,coalesced ; DARWIN: .globl _G6 ; DARWIN: .weak_definition _G6 ; DARWIN:_G6: -; DARWIN: .ascii "\001" +; DARWIN: .byte 1 @G7 = constant [10 x i8] c"abcdefghi\00"