summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2010-01-23 04:54:10 +0000
committerChris Lattner <sabre@nondot.org>2010-01-23 04:54:10 +0000
commit05f845314a67f9c30a67e55ce1e3168ff6732ce8 (patch)
treef1fd0285f7ac484a88b6828aceeeca198773eb4c
parent33b1758e16f050c79fd7d93a04e3ef7aa2971b0c (diff)
downloadllvm-05f845314a67f9c30a67e55ce1e3168ff6732ce8.tar.gz
llvm-05f845314a67f9c30a67e55ce1e3168ff6732ce8.tar.bz2
llvm-05f845314a67f9c30a67e55ce1e3168ff6732ce8.tar.xz
emit .ascii and .asciz through MCStreamer.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@94282 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/llvm/CodeGen/AsmPrinter.h4
-rw-r--r--lib/CodeGen/AsmPrinter/AsmPrinter.cpp46
-rw-r--r--test/CodeGen/X86/global-sections.ll4
3 files changed, 14 insertions, 40 deletions
diff --git a/include/llvm/CodeGen/AsmPrinter.h b/include/llvm/CodeGen/AsmPrinter.h
index b45be2752b..f527562564 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 50842078b4..f6b6307c2f 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<ConstantInt>(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<ConstantInt>(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<char, 128> TmpVec;
+ TmpVec.reserve(CA->getNumOperands());
+ for (unsigned i = 0, e = CA->getNumOperands(); i != e; ++i)
+ TmpVec.push_back(cast<ConstantInt>(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 b6caa4f27f..1a7b5777ae 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"