mirror of
				https://github.com/c64scene-ar/llvm-6502.git
				synced 2025-10-30 16:17:05 +00:00 
			
		
		
		
	Try harder to evaluate expressions when printing assembly.
When printing assembly we don't have a Layout object, but we can still try to fold some constants. Testcase by Ulrich Weigand. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@203677 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
		| @@ -91,7 +91,7 @@ public: | |||||||
|   /// @param Res - The relocatable value, if evaluation succeeds. |   /// @param Res - The relocatable value, if evaluation succeeds. | ||||||
|   /// @param Layout - The assembler layout object to use for evaluating values. |   /// @param Layout - The assembler layout object to use for evaluating values. | ||||||
|   /// @result - True on success. |   /// @result - True on success. | ||||||
|   bool EvaluateAsRelocatable(MCValue &Res, const MCAsmLayout &Layout) const; |   bool EvaluateAsRelocatable(MCValue &Res, const MCAsmLayout *Layout) const; | ||||||
|  |  | ||||||
|   /// FindAssociatedSection - Find the "associated section" for this expression, |   /// FindAssociatedSection - Find the "associated section" for this expression, | ||||||
|   /// which is currently defined as the absolute section for constants, or |   /// which is currently defined as the absolute section for constants, or | ||||||
|   | |||||||
| @@ -122,7 +122,7 @@ uint64_t MCAsmLayout::getSymbolOffset(const MCSymbolData *SD) const { | |||||||
|   // If this is a variable, then recursively evaluate now. |   // If this is a variable, then recursively evaluate now. | ||||||
|   if (S.isVariable()) { |   if (S.isVariable()) { | ||||||
|     MCValue Target; |     MCValue Target; | ||||||
|     if (!S.getVariableValue()->EvaluateAsRelocatable(Target, *this)) |     if (!S.getVariableValue()->EvaluateAsRelocatable(Target, this)) | ||||||
|       report_fatal_error("unable to evaluate offset for variable '" + |       report_fatal_error("unable to evaluate offset for variable '" + | ||||||
|                          S.getName() + "'"); |                          S.getName() + "'"); | ||||||
|  |  | ||||||
| @@ -357,7 +357,7 @@ bool MCAssembler::evaluateFixup(const MCAsmLayout &Layout, | |||||||
|                                 MCValue &Target, uint64_t &Value) const { |                                 MCValue &Target, uint64_t &Value) const { | ||||||
|   ++stats::evaluateFixup; |   ++stats::evaluateFixup; | ||||||
|  |  | ||||||
|   if (!Fixup.getValue()->EvaluateAsRelocatable(Target, Layout)) |   if (!Fixup.getValue()->EvaluateAsRelocatable(Target, &Layout)) | ||||||
|     getContext().FatalError(Fixup.getLoc(), "expected relocatable expression"); |     getContext().FatalError(Fixup.getLoc(), "expected relocatable expression"); | ||||||
|  |  | ||||||
|   bool IsPCRel = Backend.getFixupKindInfo( |   bool IsPCRel = Backend.getFixupKindInfo( | ||||||
|   | |||||||
| @@ -607,9 +607,9 @@ static bool EvaluateSymbolicAdd(const MCAssembler *Asm, | |||||||
| } | } | ||||||
|  |  | ||||||
| bool MCExpr::EvaluateAsRelocatable(MCValue &Res, | bool MCExpr::EvaluateAsRelocatable(MCValue &Res, | ||||||
|                                    const MCAsmLayout &Layout) const { |                                    const MCAsmLayout *Layout) const { | ||||||
|   return EvaluateAsRelocatableImpl(Res, &Layout.getAssembler(), &Layout, |   MCAssembler *Assembler = Layout ? &Layout->getAssembler() : 0; | ||||||
|                                    0, false); |   return EvaluateAsRelocatableImpl(Res, Assembler, Layout, 0, false); | ||||||
| } | } | ||||||
|  |  | ||||||
| bool MCExpr::EvaluateAsRelocatableImpl(MCValue &Res, | bool MCExpr::EvaluateAsRelocatableImpl(MCValue &Res, | ||||||
|   | |||||||
| @@ -82,7 +82,7 @@ uint64_t MachObjectWriter::getSymbolAddress(const MCSymbolData* SD, | |||||||
|  |  | ||||||
|  |  | ||||||
|     MCValue Target; |     MCValue Target; | ||||||
|     if (!S.getVariableValue()->EvaluateAsRelocatable(Target, Layout)) |     if (!S.getVariableValue()->EvaluateAsRelocatable(Target, &Layout)) | ||||||
|       report_fatal_error("unable to evaluate offset for variable '" + |       report_fatal_error("unable to evaluate offset for variable '" + | ||||||
|                          S.getName() + "'"); |                          S.getName() + "'"); | ||||||
|  |  | ||||||
| @@ -631,7 +631,7 @@ void MachObjectWriter::markAbsoluteVariableSymbols(MCAssembler &Asm, | |||||||
|     // and neither symbol is external, mark the variable as absolute. |     // and neither symbol is external, mark the variable as absolute. | ||||||
|     const MCExpr *Expr = SD.getSymbol().getVariableValue(); |     const MCExpr *Expr = SD.getSymbol().getVariableValue(); | ||||||
|     MCValue Value; |     MCValue Value; | ||||||
|     if (Expr->EvaluateAsRelocatable(Value, Layout)) { |     if (Expr->EvaluateAsRelocatable(Value, &Layout)) { | ||||||
|       if (Value.getSymA() && Value.getSymB()) |       if (Value.getSymA() && Value.getSymB()) | ||||||
|         const_cast<MCSymbol*>(&SD.getSymbol())->setAbsolute(); |         const_cast<MCSymbol*>(&SD.getSymbol())->setAbsolute(); | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -79,7 +79,7 @@ void AArch64MCExpr::PrintImpl(raw_ostream &OS) const { | |||||||
| bool | bool | ||||||
| AArch64MCExpr::EvaluateAsRelocatableImpl(MCValue &Res, | AArch64MCExpr::EvaluateAsRelocatableImpl(MCValue &Res, | ||||||
|                                          const MCAsmLayout *Layout) const { |                                          const MCAsmLayout *Layout) const { | ||||||
|   return getSubExpr()->EvaluateAsRelocatable(Res, *Layout); |   return getSubExpr()->EvaluateAsRelocatable(Res, Layout); | ||||||
| } | } | ||||||
|  |  | ||||||
| static void fixELFSymbolsInTLSFixupsImpl(const MCExpr *Expr, MCAssembler &Asm) { | static void fixELFSymbolsInTLSFixupsImpl(const MCExpr *Expr, MCAssembler &Asm) { | ||||||
|   | |||||||
| @@ -36,9 +36,7 @@ void MipsMCExpr::PrintImpl(raw_ostream &OS) const { | |||||||
| bool | bool | ||||||
| MipsMCExpr::EvaluateAsRelocatableImpl(MCValue &Res, | MipsMCExpr::EvaluateAsRelocatableImpl(MCValue &Res, | ||||||
|                                       const MCAsmLayout *Layout) const { |                                       const MCAsmLayout *Layout) const { | ||||||
|   if (!Layout) |   return getSubExpr()->EvaluateAsRelocatable(Res, Layout); | ||||||
|     return false; |  | ||||||
|   return getSubExpr()->EvaluateAsRelocatable(Res, *Layout); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| // FIXME: This basically copies MCObjectStreamer::AddValueSymbols. Perhaps | // FIXME: This basically copies MCObjectStreamer::AddValueSymbols. Perhaps | ||||||
|   | |||||||
| @@ -54,7 +54,7 @@ PPCMCExpr::EvaluateAsRelocatableImpl(MCValue &Res, | |||||||
|                                      const MCAsmLayout *Layout) const { |                                      const MCAsmLayout *Layout) const { | ||||||
|   MCValue Value; |   MCValue Value; | ||||||
|  |  | ||||||
|   if (!Layout || !getSubExpr()->EvaluateAsRelocatable(Value, *Layout)) |   if (!getSubExpr()->EvaluateAsRelocatable(Value, Layout)) | ||||||
|     return false; |     return false; | ||||||
|  |  | ||||||
|   if (Value.isAbsolute()) { |   if (Value.isAbsolute()) { | ||||||
| @@ -86,6 +86,9 @@ PPCMCExpr::EvaluateAsRelocatableImpl(MCValue &Res, | |||||||
|     } |     } | ||||||
|     Res = MCValue::get(Result); |     Res = MCValue::get(Result); | ||||||
|   } else { |   } else { | ||||||
|  |     if (!Layout) | ||||||
|  |       return false; | ||||||
|  |  | ||||||
|     MCContext &Context = Layout->getAssembler().getContext(); |     MCContext &Context = Layout->getAssembler().getContext(); | ||||||
|     const MCSymbolRefExpr *Sym = Value.getSymA(); |     const MCSymbolRefExpr *Sym = Value.getSymA(); | ||||||
|     MCSymbolRefExpr::VariantKind Modifier = Sym->getKind(); |     MCSymbolRefExpr::VariantKind Modifier = Sym->getKind(); | ||||||
|   | |||||||
| @@ -160,9 +160,7 @@ Sparc::Fixups SparcMCExpr::getFixupKind(SparcMCExpr::VariantKind Kind) { | |||||||
| bool | bool | ||||||
| SparcMCExpr::EvaluateAsRelocatableImpl(MCValue &Res, | SparcMCExpr::EvaluateAsRelocatableImpl(MCValue &Res, | ||||||
|                                        const MCAsmLayout *Layout) const { |                                        const MCAsmLayout *Layout) const { | ||||||
|   if (!Layout) |   return getSubExpr()->EvaluateAsRelocatable(Res, Layout); | ||||||
|     return false; |  | ||||||
|   return getSubExpr()->EvaluateAsRelocatable(Res, *Layout); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| static void fixELFSymbolsInTLSFixupsImpl(const MCExpr *Expr, MCAssembler &Asm) { | static void fixELFSymbolsInTLSFixupsImpl(const MCExpr *Expr, MCAssembler &Asm) { | ||||||
|   | |||||||
| @@ -423,6 +423,14 @@ base: | |||||||
| # CHECK-REL:                             0x{{[0-9A-F]*[048C]}} R_PPC64_TLS target 0x0 | # CHECK-REL:                             0x{{[0-9A-F]*[048C]}} R_PPC64_TLS target 0x0 | ||||||
|          add 3, 4, target@tls |          add 3, 4, target@tls | ||||||
|  |  | ||||||
|  | # Verify that fixups on constants are resolved at assemble time | ||||||
|  |  | ||||||
|  | # CHECK: ori 1, 2, 65535              # encoding: [0x60,0x41,0xff,0xff] | ||||||
|  |          ori 1, 2, 131071@l | ||||||
|  | # CHECK: ori 1, 2, 1                  # encoding: [0x60,0x41,0x00,0x01] | ||||||
|  |          ori 1, 2, 131071@h | ||||||
|  | # CHECK: ori 1, 2, 2                  # encoding: [0x60,0x41,0x00,0x02] | ||||||
|  |          ori 1, 2, 131071@ha | ||||||
|  |  | ||||||
| # Data relocs | # Data relocs | ||||||
| # llvm-mc does not show any "encoding" string for data, so we just check the relocs | # llvm-mc does not show any "encoding" string for data, so we just check the relocs | ||||||
| @@ -442,7 +450,3 @@ base: | |||||||
| # CHECK-REL: 0x{{[0-9A-F]*[08]}} R_PPC64_DTPREL64 target 0x0 | # CHECK-REL: 0x{{[0-9A-F]*[08]}} R_PPC64_DTPREL64 target 0x0 | ||||||
| 	.quad target@dtprel | 	.quad target@dtprel | ||||||
|  |  | ||||||
| # Constant fixup |  | ||||||
|         ori 1, 2, 131071@l |  | ||||||
| # CHECK: ori 1, 2, 131071@l              # encoding: [0x60,0x41,A,A] |  | ||||||
| # CHECK-NEXT:                            #   fixup A - offset: 2, value: 131071@l, kind: fixup_ppc_half16 |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user