else
O << ".func ";
printReturnValStr(F, O);
- O << *getSymbol(F) << "\n";
+ O << getSymbolName(F) << "\n";
emitFunctionParamList(F, O);
O << ";\n";
}
else
O << getPTXFundamentalTypeStr(ETy, false);
O << " ";
- O << *getSymbol(GVar);
+ O << getSymbolName(GVar);
// Ptx allows variable initilization only for constant and global state
// spaces.
bufferAggregateConstant(Initializer, &aggBuffer);
if (aggBuffer.numSymbols) {
if (nvptxSubtarget.is64Bit()) {
- O << " .u64 " << *getSymbol(GVar) << "[";
+ O << " .u64 " << getSymbolName(GVar) << "[";
O << ElementSize / 8;
} else {
- O << " .u32 " << *getSymbol(GVar) << "[";
+ O << " .u32 " << getSymbolName(GVar) << "[";
O << ElementSize / 4;
}
O << "]";
} else {
- O << " .b8 " << *getSymbol(GVar) << "[";
+ O << " .b8 " << getSymbolName(GVar) << "[";
O << ElementSize;
O << "]";
}
aggBuffer.print();
O << "}";
} else {
- O << " .b8 " << *getSymbol(GVar);
+ O << " .b8 " << getSymbolName(GVar);
if (ElementSize) {
O << "[";
O << ElementSize;
}
}
} else {
- O << " .b8 " << *getSymbol(GVar);
+ O << " .b8 " << getSymbolName(GVar);
if (ElementSize) {
O << "[";
O << ElementSize;
O << " .";
O << getPTXFundamentalTypeStr(ETy);
O << " ";
- O << *getSymbol(GVar);
+ O << getSymbolName(GVar);
return;
}
case Type::ArrayTyID:
case Type::VectorTyID:
ElementSize = TD->getTypeStoreSize(ETy);
- O << " .b8 " << *getSymbol(GVar) << "[";
+ O << " .b8 " << getSymbolName(GVar) << "[";
if (ElementSize) {
O << itostr(ElementSize);
}
int paramIndex, raw_ostream &O) {
if ((nvptxSubtarget.getDrvInterface() == NVPTX::NVCL) ||
(nvptxSubtarget.getDrvInterface() == NVPTX::CUDA))
- O << *getSymbol(I->getParent()) << "_param_" << paramIndex;
+ O << getSymbolName(I->getParent()) << "_param_" << paramIndex;
else {
std::string argName = I->getName();
const char *p = argName.c_str();
if (llvm::isImage(*I)) {
std::string sname = I->getName();
if (llvm::isImageWriteOnly(*I))
- O << "\t.param .surfref " << *getSymbol(F) << "_param_"
+ O << "\t.param .surfref " << getSymbolName(F) << "_param_"
<< paramIndex;
else // Default image is read_only
- O << "\t.param .texref " << *getSymbol(F) << "_param_"
+ O << "\t.param .texref " << getSymbolName(F) << "_param_"
<< paramIndex;
} else // Should be llvm::isSampler(*I)
- O << "\t.param .samplerref " << *getSymbol(F) << "_param_"
+ O << "\t.param .samplerref " << getSymbolName(F) << "_param_"
<< paramIndex;
continue;
}
return;
}
if (const GlobalValue *GVar = dyn_cast<GlobalValue>(CPV)) {
- O << *getSymbol(GVar);
+ O << getSymbolName(GVar);
return;
}
if (const ConstantExpr *Cexpr = dyn_cast<ConstantExpr>(CPV)) {
const Value *v = Cexpr->stripPointerCasts();
if (const GlobalValue *GVar = dyn_cast<GlobalValue>(v)) {
- O << *getSymbol(GVar);
+ O << getSymbolName(GVar);
return;
} else {
O << *LowerConstant(CPV, *this);
break;
case MachineOperand::MO_GlobalAddress:
- O << *getSymbol(MO.getGlobal());
+ O << getSymbolName(MO.getGlobal());
break;
case MachineOperand::MO_MachineBasicBlock:
return reader;
}
+std::string NVPTXAsmPrinter::getSymbolName(const GlobalValue *GV) const {
+ // Obtain the original symbol name.
+ MCSymbol *Sym = getSymbol(GV);
+ std::string OriginalName;
+ raw_string_ostream OriginalNameStream(OriginalName);
+ Sym->print(OriginalNameStream);
+ OriginalNameStream.flush();
+
+ // MCSymbol already does symbol-name sanitizing, so names it produces are
+ // valid for object files. The only two characters valida in that context
+ // and indigestible by the PTX assembler are '.' and '@'.
+ std::string CleanName;
+ raw_string_ostream CleanNameStream(CleanName);
+ for (unsigned I = 0, E = OriginalName.size(); I != E; ++I) {
+ char C = OriginalName[I];
+ if (C == '.') {
+ CleanNameStream << "_$_";
+ } else if (C == '@') {
+ CleanNameStream << "_%_";
+ } else {
+ CleanNameStream << C;
+ }
+ }
+
+ return CleanNameStream.str();
+}
+
std::string LineReader::readLine(unsigned lineNum) {
if (lineNum < theCurLine) {
theCurLine = 0;