17e1a8f882f1baa1c0d5204373d6eb4cb7fc9f3eaChris Lattner//===-- AsmPrinterDwarf.cpp - AsmPrinter Dwarf Support --------------------===// 27e1a8f882f1baa1c0d5204373d6eb4cb7fc9f3eaChris Lattner// 37e1a8f882f1baa1c0d5204373d6eb4cb7fc9f3eaChris Lattner// The LLVM Compiler Infrastructure 47e1a8f882f1baa1c0d5204373d6eb4cb7fc9f3eaChris Lattner// 57e1a8f882f1baa1c0d5204373d6eb4cb7fc9f3eaChris Lattner// This file is distributed under the University of Illinois Open Source 67e1a8f882f1baa1c0d5204373d6eb4cb7fc9f3eaChris Lattner// License. See LICENSE.TXT for details. 77e1a8f882f1baa1c0d5204373d6eb4cb7fc9f3eaChris Lattner// 87e1a8f882f1baa1c0d5204373d6eb4cb7fc9f3eaChris Lattner//===----------------------------------------------------------------------===// 97e1a8f882f1baa1c0d5204373d6eb4cb7fc9f3eaChris Lattner// 107e1a8f882f1baa1c0d5204373d6eb4cb7fc9f3eaChris Lattner// This file implements the Dwarf emissions parts of AsmPrinter. 117e1a8f882f1baa1c0d5204373d6eb4cb7fc9f3eaChris Lattner// 127e1a8f882f1baa1c0d5204373d6eb4cb7fc9f3eaChris Lattner//===----------------------------------------------------------------------===// 137e1a8f882f1baa1c0d5204373d6eb4cb7fc9f3eaChris Lattner 147e1a8f882f1baa1c0d5204373d6eb4cb7fc9f3eaChris Lattner#define DEBUG_TYPE "asm-printer" 157e1a8f882f1baa1c0d5204373d6eb4cb7fc9f3eaChris Lattner#include "llvm/CodeGen/AsmPrinter.h" 16d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/ADT/Twine.h" 170b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/DataLayout.h" 187e1a8f882f1baa1c0d5204373d6eb4cb7fc9f3eaChris Lattner#include "llvm/MC/MCAsmInfo.h" 196189ed10c1a6a39ad516aca2bda2c05fff35a55bChris Lattner#include "llvm/MC/MCSection.h" 207e1a8f882f1baa1c0d5204373d6eb4cb7fc9f3eaChris Lattner#include "llvm/MC/MCStreamer.h" 216189ed10c1a6a39ad516aca2bda2c05fff35a55bChris Lattner#include "llvm/MC/MCSymbol.h" 22d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/MC/MachineLocation.h" 23d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Support/Dwarf.h" 24d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/Support/ErrorHandling.h" 2516c29b5f285f375be53dabaa73e3e91107485fe4Anton Korobeynikov#include "llvm/Target/TargetFrameLowering.h" 26d2af7853e377bce40cbf3e0632a4608484b6aba4Chris Lattner#include "llvm/Target/TargetLoweringObjectFile.h" 27d2af7853e377bce40cbf3e0632a4608484b6aba4Chris Lattner#include "llvm/Target/TargetMachine.h" 2802b86b93dc4616571fed3473c6da9421c10f2fccChris Lattner#include "llvm/Target/TargetRegisterInfo.h" 297e1a8f882f1baa1c0d5204373d6eb4cb7fc9f3eaChris Lattnerusing namespace llvm; 307e1a8f882f1baa1c0d5204373d6eb4cb7fc9f3eaChris Lattner 3102b86b93dc4616571fed3473c6da9421c10f2fccChris Lattner//===----------------------------------------------------------------------===// 3202b86b93dc4616571fed3473c6da9421c10f2fccChris Lattner// Dwarf Emission Helper Routines 3302b86b93dc4616571fed3473c6da9421c10f2fccChris Lattner//===----------------------------------------------------------------------===// 3402b86b93dc4616571fed3473c6da9421c10f2fccChris Lattner 357e1a8f882f1baa1c0d5204373d6eb4cb7fc9f3eaChris Lattner/// EmitSLEB128 - emit the specified signed leb128 value. 36fe2e66a6dab6162fb10ed2d576cd122f34d2626fDavid Blaikievoid AsmPrinter::EmitSLEB128(int64_t Value, const char *Desc) const { 377e1a8f882f1baa1c0d5204373d6eb4cb7fc9f3eaChris Lattner if (isVerbose() && Desc) 387e1a8f882f1baa1c0d5204373d6eb4cb7fc9f3eaChris Lattner OutStreamer.AddComment(Desc); 397e1a8f882f1baa1c0d5204373d6eb4cb7fc9f3eaChris Lattner 40c25c90897781f116d5dbabab170bafcf65900fa7Benjamin Kramer OutStreamer.EmitSLEB128IntValue(Value); 417e1a8f882f1baa1c0d5204373d6eb4cb7fc9f3eaChris Lattner} 427e1a8f882f1baa1c0d5204373d6eb4cb7fc9f3eaChris Lattner 437e1a8f882f1baa1c0d5204373d6eb4cb7fc9f3eaChris Lattner/// EmitULEB128 - emit the specified signed leb128 value. 44fe2e66a6dab6162fb10ed2d576cd122f34d2626fDavid Blaikievoid AsmPrinter::EmitULEB128(uint64_t Value, const char *Desc, 457e1a8f882f1baa1c0d5204373d6eb4cb7fc9f3eaChris Lattner unsigned PadTo) const { 467e1a8f882f1baa1c0d5204373d6eb4cb7fc9f3eaChris Lattner if (isVerbose() && Desc) 477e1a8f882f1baa1c0d5204373d6eb4cb7fc9f3eaChris Lattner OutStreamer.AddComment(Desc); 48738734501635a15d8ed2d1c8d52962ed5f319bd3Rafael Espindola 491ced208be9cab0f994c5df9000da36bc313b2507Eric Christopher OutStreamer.EmitULEB128IntValue(Value, PadTo); 507e1a8f882f1baa1c0d5204373d6eb4cb7fc9f3eaChris Lattner} 517e1a8f882f1baa1c0d5204373d6eb4cb7fc9f3eaChris Lattner 527a101f45c10082e9765ffec57a2d51f5fd0abc37Chris Lattner/// EmitCFAByte - Emit a .byte 42 directive for a DW_CFA_xxx value. 537a101f45c10082e9765ffec57a2d51f5fd0abc37Chris Lattnervoid AsmPrinter::EmitCFAByte(unsigned Val) const { 547a101f45c10082e9765ffec57a2d51f5fd0abc37Chris Lattner if (isVerbose()) { 557a101f45c10082e9765ffec57a2d51f5fd0abc37Chris Lattner if (Val >= dwarf::DW_CFA_offset && Val < dwarf::DW_CFA_offset+64) 56aaa50b9bc5e8707015ff31dce0a3665600f6b440Eric Christopher OutStreamer.AddComment("DW_CFA_offset + Reg (" + 577a101f45c10082e9765ffec57a2d51f5fd0abc37Chris Lattner Twine(Val-dwarf::DW_CFA_offset) + ")"); 587a101f45c10082e9765ffec57a2d51f5fd0abc37Chris Lattner else 597a101f45c10082e9765ffec57a2d51f5fd0abc37Chris Lattner OutStreamer.AddComment(dwarf::CallFrameString(Val)); 607a101f45c10082e9765ffec57a2d51f5fd0abc37Chris Lattner } 61ca1dd05c3c12e857614ae6837f90894396225dd6Eric Christopher OutStreamer.EmitIntValue(Val, 1); 627a101f45c10082e9765ffec57a2d51f5fd0abc37Chris Lattner} 637a101f45c10082e9765ffec57a2d51f5fd0abc37Chris Lattner 64ca6190b108aeb4a2eeb6f5c6457bb17509b85d9dChris Lattnerstatic const char *DecodeDWARFEncoding(unsigned Encoding) { 65ca6190b108aeb4a2eeb6f5c6457bb17509b85d9dChris Lattner switch (Encoding) { 66ca6190b108aeb4a2eeb6f5c6457bb17509b85d9dChris Lattner case dwarf::DW_EH_PE_absptr: return "absptr"; 67ca6190b108aeb4a2eeb6f5c6457bb17509b85d9dChris Lattner case dwarf::DW_EH_PE_omit: return "omit"; 68ca6190b108aeb4a2eeb6f5c6457bb17509b85d9dChris Lattner case dwarf::DW_EH_PE_pcrel: return "pcrel"; 69ca6190b108aeb4a2eeb6f5c6457bb17509b85d9dChris Lattner case dwarf::DW_EH_PE_udata4: return "udata4"; 70ca6190b108aeb4a2eeb6f5c6457bb17509b85d9dChris Lattner case dwarf::DW_EH_PE_udata8: return "udata8"; 71ca6190b108aeb4a2eeb6f5c6457bb17509b85d9dChris Lattner case dwarf::DW_EH_PE_sdata4: return "sdata4"; 72ca6190b108aeb4a2eeb6f5c6457bb17509b85d9dChris Lattner case dwarf::DW_EH_PE_sdata8: return "sdata8"; 73ca6190b108aeb4a2eeb6f5c6457bb17509b85d9dChris Lattner case dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_udata4: return "pcrel udata4"; 74ca6190b108aeb4a2eeb6f5c6457bb17509b85d9dChris Lattner case dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4: return "pcrel sdata4"; 75ca6190b108aeb4a2eeb6f5c6457bb17509b85d9dChris Lattner case dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_udata8: return "pcrel udata8"; 76ca6190b108aeb4a2eeb6f5c6457bb17509b85d9dChris Lattner case dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata8: return "pcrel sdata8"; 77ca6190b108aeb4a2eeb6f5c6457bb17509b85d9dChris Lattner case dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |dwarf::DW_EH_PE_udata4: 78ca6190b108aeb4a2eeb6f5c6457bb17509b85d9dChris Lattner return "indirect pcrel udata4"; 79ca6190b108aeb4a2eeb6f5c6457bb17509b85d9dChris Lattner case dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |dwarf::DW_EH_PE_sdata4: 80ca6190b108aeb4a2eeb6f5c6457bb17509b85d9dChris Lattner return "indirect pcrel sdata4"; 81ca6190b108aeb4a2eeb6f5c6457bb17509b85d9dChris Lattner case dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |dwarf::DW_EH_PE_udata8: 82ca6190b108aeb4a2eeb6f5c6457bb17509b85d9dChris Lattner return "indirect pcrel udata8"; 83ca6190b108aeb4a2eeb6f5c6457bb17509b85d9dChris Lattner case dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |dwarf::DW_EH_PE_sdata8: 84ca6190b108aeb4a2eeb6f5c6457bb17509b85d9dChris Lattner return "indirect pcrel sdata8"; 85ca6190b108aeb4a2eeb6f5c6457bb17509b85d9dChris Lattner } 86aaa50b9bc5e8707015ff31dce0a3665600f6b440Eric Christopher 87ca6190b108aeb4a2eeb6f5c6457bb17509b85d9dChris Lattner return "<unknown encoding>"; 88ca6190b108aeb4a2eeb6f5c6457bb17509b85d9dChris Lattner} 89ca6190b108aeb4a2eeb6f5c6457bb17509b85d9dChris Lattner 90ca6190b108aeb4a2eeb6f5c6457bb17509b85d9dChris Lattner 91ca6190b108aeb4a2eeb6f5c6457bb17509b85d9dChris Lattner/// EmitEncodingByte - Emit a .byte 42 directive that corresponds to an 92ca6190b108aeb4a2eeb6f5c6457bb17509b85d9dChris Lattner/// encoding. If verbose assembly output is enabled, we output comments 93ca6190b108aeb4a2eeb6f5c6457bb17509b85d9dChris Lattner/// describing the encoding. Desc is an optional string saying what the 94ca6190b108aeb4a2eeb6f5c6457bb17509b85d9dChris Lattner/// encoding is specifying (e.g. "LSDA"). 9502b86b93dc4616571fed3473c6da9421c10f2fccChris Lattnervoid AsmPrinter::EmitEncodingByte(unsigned Val, const char *Desc) const { 96ca6190b108aeb4a2eeb6f5c6457bb17509b85d9dChris Lattner if (isVerbose()) { 97ca6190b108aeb4a2eeb6f5c6457bb17509b85d9dChris Lattner if (Desc != 0) 98ca6190b108aeb4a2eeb6f5c6457bb17509b85d9dChris Lattner OutStreamer.AddComment(Twine(Desc)+" Encoding = " + 99ca6190b108aeb4a2eeb6f5c6457bb17509b85d9dChris Lattner Twine(DecodeDWARFEncoding(Val))); 100ca6190b108aeb4a2eeb6f5c6457bb17509b85d9dChris Lattner else 101ca6190b108aeb4a2eeb6f5c6457bb17509b85d9dChris Lattner OutStreamer.AddComment(Twine("Encoding = ") + 102ca6190b108aeb4a2eeb6f5c6457bb17509b85d9dChris Lattner DecodeDWARFEncoding(Val)); 103ca6190b108aeb4a2eeb6f5c6457bb17509b85d9dChris Lattner } 104aaa50b9bc5e8707015ff31dce0a3665600f6b440Eric Christopher 105ca1dd05c3c12e857614ae6837f90894396225dd6Eric Christopher OutStreamer.EmitIntValue(Val, 1); 106ca6190b108aeb4a2eeb6f5c6457bb17509b85d9dChris Lattner} 107ca6190b108aeb4a2eeb6f5c6457bb17509b85d9dChris Lattner 108d2af7853e377bce40cbf3e0632a4608484b6aba4Chris Lattner/// GetSizeOfEncodedValue - Return the size of the encoding in bytes. 109d2af7853e377bce40cbf3e0632a4608484b6aba4Chris Lattnerunsigned AsmPrinter::GetSizeOfEncodedValue(unsigned Encoding) const { 110d2af7853e377bce40cbf3e0632a4608484b6aba4Chris Lattner if (Encoding == dwarf::DW_EH_PE_omit) 111d2af7853e377bce40cbf3e0632a4608484b6aba4Chris Lattner return 0; 112aaa50b9bc5e8707015ff31dce0a3665600f6b440Eric Christopher 113d2af7853e377bce40cbf3e0632a4608484b6aba4Chris Lattner switch (Encoding & 0x07) { 1145e25ee8a1fcf8288d00d731b0f7ab7976f33b123Craig Topper default: llvm_unreachable("Invalid encoded value."); 115426c2bf5cdd2173e4a33aea8cb92cf684a724f4bChandler Carruth case dwarf::DW_EH_PE_absptr: return TM.getDataLayout()->getPointerSize(); 116d2af7853e377bce40cbf3e0632a4608484b6aba4Chris Lattner case dwarf::DW_EH_PE_udata2: return 2; 117d2af7853e377bce40cbf3e0632a4608484b6aba4Chris Lattner case dwarf::DW_EH_PE_udata4: return 4; 118d2af7853e377bce40cbf3e0632a4608484b6aba4Chris Lattner case dwarf::DW_EH_PE_udata8: return 8; 119d2af7853e377bce40cbf3e0632a4608484b6aba4Chris Lattner } 120d2af7853e377bce40cbf3e0632a4608484b6aba4Chris Lattner} 121d2af7853e377bce40cbf3e0632a4608484b6aba4Chris Lattner 122aaa50b9bc5e8707015ff31dce0a3665600f6b440Eric Christophervoid AsmPrinter::EmitTTypeReference(const GlobalValue *GV, 123aaa50b9bc5e8707015ff31dce0a3665600f6b440Eric Christopher unsigned Encoding) const { 124239938ff77ef43c753881b030438f89a3dfc72c4Anton Korobeynikov if (GV) { 125239938ff77ef43c753881b030438f89a3dfc72c4Anton Korobeynikov const TargetLoweringObjectFile &TLOF = getObjFileLowering(); 126aaa50b9bc5e8707015ff31dce0a3665600f6b440Eric Christopher 127239938ff77ef43c753881b030438f89a3dfc72c4Anton Korobeynikov const MCExpr *Exp = 128239938ff77ef43c753881b030438f89a3dfc72c4Anton Korobeynikov TLOF.getTTypeGlobalReference(GV, Mang, MMI, Encoding, OutStreamer); 129ca1dd05c3c12e857614ae6837f90894396225dd6Eric Christopher OutStreamer.EmitValue(Exp, GetSizeOfEncodedValue(Encoding)); 130239938ff77ef43c753881b030438f89a3dfc72c4Anton Korobeynikov } else 131ca1dd05c3c12e857614ae6837f90894396225dd6Eric Christopher OutStreamer.EmitIntValue(0, GetSizeOfEncodedValue(Encoding)); 132d2af7853e377bce40cbf3e0632a4608484b6aba4Chris Lattner} 1336189ed10c1a6a39ad516aca2bda2c05fff35a55bChris Lattner 1346189ed10c1a6a39ad516aca2bda2c05fff35a55bChris Lattner/// EmitSectionOffset - Emit the 4-byte offset of Label from the start of its 1356189ed10c1a6a39ad516aca2bda2c05fff35a55bChris Lattner/// section. This can be done with a special directive if the target supports 1366189ed10c1a6a39ad516aca2bda2c05fff35a55bChris Lattner/// it (e.g. cygwin) or by emitting it as an offset from a label at the start 1376189ed10c1a6a39ad516aca2bda2c05fff35a55bChris Lattner/// of the section. 1386189ed10c1a6a39ad516aca2bda2c05fff35a55bChris Lattner/// 1396189ed10c1a6a39ad516aca2bda2c05fff35a55bChris Lattner/// SectionLabel is a temporary label emitted at the start of the section that 1406189ed10c1a6a39ad516aca2bda2c05fff35a55bChris Lattner/// Label lives in. 1416189ed10c1a6a39ad516aca2bda2c05fff35a55bChris Lattnervoid AsmPrinter::EmitSectionOffset(const MCSymbol *Label, 1426189ed10c1a6a39ad516aca2bda2c05fff35a55bChris Lattner const MCSymbol *SectionLabel) const { 1436189ed10c1a6a39ad516aca2bda2c05fff35a55bChris Lattner // On COFF targets, we have to emit the special .secrel32 directive. 1449a0e12a6ed7db1bf49e4676932427e91ae4eb9beMatt Arsenault if (MAI->needsDwarfSectionOffsetDirective()) { 1458f7d12ccfd8feb258bdf4e582592bc00beacc7c6Rafael Espindola OutStreamer.EmitCOFFSecRel32(Label); 1466189ed10c1a6a39ad516aca2bda2c05fff35a55bChris Lattner return; 1476189ed10c1a6a39ad516aca2bda2c05fff35a55bChris Lattner } 148aaa50b9bc5e8707015ff31dce0a3665600f6b440Eric Christopher 1496189ed10c1a6a39ad516aca2bda2c05fff35a55bChris Lattner // Get the section that we're referring to, based on SectionLabel. 1506189ed10c1a6a39ad516aca2bda2c05fff35a55bChris Lattner const MCSection &Section = SectionLabel->getSection(); 151aaa50b9bc5e8707015ff31dce0a3665600f6b440Eric Christopher 1526189ed10c1a6a39ad516aca2bda2c05fff35a55bChris Lattner // If Label has already been emitted, verify that it is in the same section as 1536189ed10c1a6a39ad516aca2bda2c05fff35a55bChris Lattner // section label for sanity. 1546189ed10c1a6a39ad516aca2bda2c05fff35a55bChris Lattner assert((!Label->isInSection() || &Label->getSection() == &Section) && 1556189ed10c1a6a39ad516aca2bda2c05fff35a55bChris Lattner "Section offset using wrong section base for label"); 156aaa50b9bc5e8707015ff31dce0a3665600f6b440Eric Christopher 157ba9934648f1b8f5b1749548963f385f1147c1f68Duncan Sands // If the section in question will end up with an address of 0 anyway, we can 158ba9934648f1b8f5b1749548963f385f1147c1f68Duncan Sands // just emit an absolute reference to save a relocation. 159ba9934648f1b8f5b1749548963f385f1147c1f68Duncan Sands if (Section.isBaseAddressKnownZero()) { 160ca1dd05c3c12e857614ae6837f90894396225dd6Eric Christopher OutStreamer.EmitSymbolValue(Label, 4); 161ba9934648f1b8f5b1749548963f385f1147c1f68Duncan Sands return; 162ba9934648f1b8f5b1749548963f385f1147c1f68Duncan Sands } 163aaa50b9bc5e8707015ff31dce0a3665600f6b440Eric Christopher 1646189ed10c1a6a39ad516aca2bda2c05fff35a55bChris Lattner // Otherwise, emit it as a label difference from the start of the section. 1656189ed10c1a6a39ad516aca2bda2c05fff35a55bChris Lattner EmitLabelDifference(Label, SectionLabel, 4); 1666189ed10c1a6a39ad516aca2bda2c05fff35a55bChris Lattner} 1676189ed10c1a6a39ad516aca2bda2c05fff35a55bChris Lattner 16802b86b93dc4616571fed3473c6da9421c10f2fccChris Lattner//===----------------------------------------------------------------------===// 16902b86b93dc4616571fed3473c6da9421c10f2fccChris Lattner// Dwarf Lowering Routines 17002b86b93dc4616571fed3473c6da9421c10f2fccChris Lattner//===----------------------------------------------------------------------===// 17102b86b93dc4616571fed3473c6da9421c10f2fccChris Lattner 1724a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindolavoid AsmPrinter::emitCFIInstruction(const MCCFIInstruction &Inst) const { 1734a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola switch (Inst.getOperation()) { 1744a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola default: 1754a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola llvm_unreachable("Unexpected instruction"); 1764a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola case MCCFIInstruction::OpDefCfaOffset: 1774a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola OutStreamer.EmitCFIDefCfaOffset(Inst.getOffset()); 1784a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola break; 1794a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola case MCCFIInstruction::OpDefCfa: 1804a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola OutStreamer.EmitCFIDefCfa(Inst.getRegister(), Inst.getOffset()); 1814a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola break; 1824a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola case MCCFIInstruction::OpDefCfaRegister: 1834a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola OutStreamer.EmitCFIDefCfaRegister(Inst.getRegister()); 1844a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola break; 1854a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola case MCCFIInstruction::OpOffset: 1864a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola OutStreamer.EmitCFIOffset(Inst.getRegister(), Inst.getOffset()); 1874a971705bc6030dc2e4338b3cd5cffa2e0f88b7bRafael Espindola break; 188126ae6815263aeffe4fbaa6dff1e4428aa8f0a91Rafael Espindola } 189126ae6815263aeffe4fbaa6dff1e4428aa8f0a91Rafael Espindola} 190