mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-17 21:29:20 +00:00
add support for .asciz, and enable it by default. If your target assemblerdoesn't support .asciz, just set AscizDirective to null in your asmprinter.
This compiles C strings to: l1__2E_str_1: ; '.str_1' .asciz "foo" instead of: l1__2E_str_1: ; '.str_1' .ascii "foo\000" git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@24272 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
38b6d78112
commit
2980cefb80
@ -141,14 +141,15 @@ static inline char toOctal(int X) {
|
||||
return (X&7)+'0';
|
||||
}
|
||||
|
||||
/// getAsCString - Return the specified array as a C compatible string, only if
|
||||
/// printAsCString - Print the specified array as a C compatible string, only if
|
||||
/// the predicate isString is true.
|
||||
///
|
||||
static void printAsCString(std::ostream &O, const ConstantArray *CVA) {
|
||||
static void printAsCString(std::ostream &O, const ConstantArray *CVA,
|
||||
unsigned LastElt) {
|
||||
assert(CVA->isString() && "Array is not string compatible!");
|
||||
|
||||
O << "\"";
|
||||
for (unsigned i = 0; i != CVA->getNumOperands(); ++i) {
|
||||
for (unsigned i = 0; i != LastElt; ++i) {
|
||||
unsigned char C =
|
||||
(unsigned char)cast<ConstantInt>(CVA->getOperand(i))->getRawValue();
|
||||
|
||||
@ -187,8 +188,15 @@ void AsmPrinter::emitGlobalConstant(const Constant *CV) {
|
||||
return;
|
||||
} else if (const ConstantArray *CVA = dyn_cast<ConstantArray>(CV)) {
|
||||
if (CVA->isString()) {
|
||||
O << AsciiDirective;
|
||||
printAsCString(O, CVA);
|
||||
unsigned NumElts = CVA->getNumOperands();
|
||||
if (AscizDirective && NumElts &&
|
||||
cast<ConstantInt>(CVA->getOperand(NumElts-1))->getRawValue() == 0) {
|
||||
O << AscizDirective;
|
||||
printAsCString(O, CVA, NumElts-1);
|
||||
} else {
|
||||
O << AsciiDirective;
|
||||
printAsCString(O, CVA, NumElts);
|
||||
}
|
||||
O << "\n";
|
||||
} else { // Not a string. Print the values in successive locations
|
||||
for (unsigned i = 0, e = CVA->getNumOperands(); i != e; ++i)
|
||||
|
Loading…
Reference in New Issue
Block a user