Skip to content

Commit 7f137d3

Browse files
authored
Merge pull request #11869 from ethereum/remodelUseSrc
Allow and require use-src to be repeated for each object.
2 parents 9c2ab1f + 5caa158 commit 7f137d3

File tree

31 files changed

+67
-41
lines changed

31 files changed

+67
-41
lines changed

libsolidity/codegen/ir/IRGenerator.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ string IRGenerator::generate(
133133
};
134134

135135
Whiskers t(R"(
136-
/// @use-src <useSrcMap>
136+
/// @use-src <useSrcMapCreation>
137137
object "<CreationObject>" {
138138
code {
139139
<sourceLocationComment>
@@ -147,6 +147,7 @@ string IRGenerator::generate(
147147
<deploy>
148148
<functions>
149149
}
150+
/// @use-src <useSrcMapDeployed>
150151
object "<DeployedObject>" {
151152
code {
152153
<sourceLocationComment>
@@ -177,7 +178,7 @@ string IRGenerator::generate(
177178
", "
178179
);
179180

180-
t("useSrcMap", useSrcMap);
181+
t("useSrcMapCreation", useSrcMap);
181182
t("sourceLocationComment", sourceLocationComment(_contract, m_context));
182183

183184
t("CreationObject", IRNames::creationObject(_contract));
@@ -219,6 +220,7 @@ string IRGenerator::generate(
219220
m_context.initializeInternalDispatch(move(internalDispatchMap));
220221

221222
// Do not register immutables to avoid assignment.
223+
t("useSrcMapDeployed", useSrcMap);
222224
t("DeployedObject", IRNames::deployedObject(_contract));
223225
t("library_address", IRNames::libraryAddressImmutable());
224226
t("dispatch", dispatchRoutine(_contract));

libyul/Object.cpp

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -50,38 +50,32 @@ string indent(std::string const& _input)
5050

5151
}
5252

53-
string Data::toString(Dialect const*, optional<SourceNameMap>) const
53+
string Data::toString(Dialect const*) const
5454
{
5555
return "data \"" + name.str() + "\" hex\"" + util::toHex(data) + "\"";
5656
}
5757

5858
string Object::toString(Dialect const* _dialect) const
5959
{
60+
yulAssert(code, "No code");
61+
yulAssert(debugData, "No debug data");
62+
6063
string useSrcComment;
6164

62-
if (debugData && debugData->sourceNames)
65+
if (debugData->sourceNames)
6366
useSrcComment =
6467
"/// @use-src " +
6568
joinHumanReadable(ranges::views::transform(*debugData->sourceNames, [](auto&& _pair) {
6669
return to_string(_pair.first) + ":" + util::escapeAndQuoteString(*_pair.second);
6770
})) +
6871
"\n";
69-
return useSrcComment + toString(_dialect, debugData ? debugData->sourceNames : optional<SourceNameMap>{});
70-
}
7172

72-
string Object::toString(Dialect const* _dialect, std::optional<SourceNameMap> _sourceNames) const
73-
{
74-
yulAssert(code, "No code");
75-
string inner = "code " + AsmPrinter{_dialect, _sourceNames}(*code);
73+
string inner = "code " + AsmPrinter{_dialect, debugData->sourceNames}(*code);
7674

7775
for (auto const& obj: subObjects)
78-
{
79-
if (auto const* o = dynamic_cast<Object const*>(obj.get()))
80-
yulAssert(!o->debugData || !o->debugData->sourceNames, "");
81-
inner += "\n" + obj->toString(_dialect, _sourceNames);
82-
}
76+
inner += "\n" + obj->toString(_dialect);
8377

84-
return "object \"" + name.str() + "\" {\n" + indent(inner) + "\n}";
78+
return useSrcComment + "object \"" + name.str() + "\" {\n" + indent(inner) + "\n}";
8579
}
8680

8781
set<YulString> Object::qualifiedDataNames() const

libyul/Object.h

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -49,11 +49,8 @@ struct ObjectNode
4949
/// Name of the object.
5050
/// Can be empty since .yul files can also just contain code, without explicitly placing it in an object.
5151
YulString name;
52-
protected:
53-
virtual std::string toString(Dialect const* _dialect, std::optional<SourceNameMap> _sourceNames) const = 0;
5452

55-
/// Object should have access to toString
56-
friend struct Object;
53+
virtual std::string toString(Dialect const* _dialect) const = 0;
5754
};
5855

5956
/**
@@ -65,8 +62,7 @@ struct Data: public ObjectNode
6562

6663
bytes data;
6764

68-
protected:
69-
std::string toString(Dialect const* _dialect, std::optional<SourceNameMap> _sourceNames) const override;
65+
std::string toString(Dialect const* _dialect) const override;
7066
};
7167

7268

@@ -114,8 +110,6 @@ struct Object: public ObjectNode
114110

115111
/// @returns the name of the special metadata data object.
116112
static std::string metadataName() { return ".metadata"; }
117-
protected:
118-
std::string toString(Dialect const* _dialect, std::optional<SourceNameMap> _sourceNames) const override;
119113
};
120114

121115
}

libyul/ObjectParser.cpp

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -45,22 +45,22 @@ shared_ptr<Object> ObjectParser::parse(shared_ptr<Scanner> const& _scanner, bool
4545
{
4646
shared_ptr<Object> object;
4747
m_scanner = _scanner;
48-
m_sourceNameMapping = tryParseSourceNameMapping();
4948

5049
if (currentToken() == Token::LBrace)
5150
{
5251
// Special case: Code-only form.
5352
object = make_shared<Object>();
5453
object->name = "object"_yulstring;
55-
object->code = parseBlock();
54+
auto sourceNameMapping = tryParseSourceNameMapping();
55+
object->debugData = make_shared<ObjectDebugData>(ObjectDebugData{sourceNameMapping});
56+
object->code = parseBlock(sourceNameMapping);
5657
if (!object->code)
5758
return nullptr;
5859
}
5960
else
6061
object = parseObject();
6162
if (!_reuseScanner)
6263
expectToken(Token::EOS);
63-
object->debugData = make_shared<ObjectDebugData>(ObjectDebugData{m_sourceNameMapping});
6464
return object;
6565
}
6666
catch (FatalError const&)
@@ -75,16 +75,20 @@ shared_ptr<Object> ObjectParser::parseObject(Object* _containingObject)
7575
{
7676
RecursionGuard guard(*this);
7777

78+
shared_ptr<Object> ret = make_shared<Object>();
79+
80+
auto sourceNameMapping = tryParseSourceNameMapping();
81+
ret->debugData = make_shared<ObjectDebugData>(ObjectDebugData{sourceNameMapping});
82+
7883
if (currentToken() != Token::Identifier || currentLiteral() != "object")
7984
fatalParserError(4294_error, "Expected keyword \"object\".");
8085
advance();
8186

82-
shared_ptr<Object> ret = make_shared<Object>();
8387
ret->name = parseUniqueName(_containingObject);
8488

8589
expectToken(Token::LBrace);
8690

87-
ret->code = parseCode();
91+
ret->code = parseCode(move(sourceNameMapping));
8892

8993
while (currentToken() != Token::RBrace)
9094
{
@@ -103,13 +107,13 @@ shared_ptr<Object> ObjectParser::parseObject(Object* _containingObject)
103107
return ret;
104108
}
105109

106-
shared_ptr<Block> ObjectParser::parseCode()
110+
shared_ptr<Block> ObjectParser::parseCode(optional<SourceNameMap> _sourceNames)
107111
{
108112
if (currentToken() != Token::Identifier || currentLiteral() != "code")
109113
fatalParserError(4846_error, "Expected keyword \"code\".");
110114
advance();
111115

112-
return parseBlock();
116+
return parseBlock(move(_sourceNames));
113117
}
114118

115119
optional<SourceNameMap> ObjectParser::tryParseSourceNameMapping() const
@@ -166,9 +170,9 @@ optional<SourceNameMap> ObjectParser::tryParseSourceNameMapping() const
166170
return nullopt;
167171
}
168172

169-
shared_ptr<Block> ObjectParser::parseBlock()
173+
shared_ptr<Block> ObjectParser::parseBlock(optional<SourceNameMap> _sourceNames)
170174
{
171-
Parser parser(m_errorReporter, m_dialect, m_sourceNameMapping);
175+
Parser parser(m_errorReporter, m_dialect, move(_sourceNames));
172176
shared_ptr<Block> block = parser.parseInline(m_scanner);
173177
yulAssert(block || m_errorReporter.hasErrors(), "Invalid block but no error!");
174178
return block;

libyul/ObjectParser.h

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -55,22 +55,18 @@ class ObjectParser: public langutil::ParserBase
5555
/// @returns an empty shared pointer on error.
5656
std::shared_ptr<Object> parse(std::shared_ptr<langutil::Scanner> const& _scanner, bool _reuseScanner);
5757

58-
std::optional<SourceNameMap> const& sourceNameMapping() const noexcept { return m_sourceNameMapping; }
59-
6058
private:
6159
std::optional<SourceNameMap> tryParseSourceNameMapping() const;
6260
std::shared_ptr<Object> parseObject(Object* _containingObject = nullptr);
63-
std::shared_ptr<Block> parseCode();
64-
std::shared_ptr<Block> parseBlock();
61+
std::shared_ptr<Block> parseCode(std::optional<SourceNameMap> _sourceNames);
62+
std::shared_ptr<Block> parseBlock(std::optional<SourceNameMap> _sourceNames);
6563
void parseData(Object& _containingObject);
6664

6765
/// Tries to parse a name that is non-empty and unique inside the containing object.
6866
YulString parseUniqueName(Object const* _containingObject);
6967
void addNamedSubObject(Object& _container, YulString _name, std::shared_ptr<ObjectNode> _subObject);
7068

7169
Dialect const& m_dialect;
72-
73-
std::optional<SourceNameMap> m_sourceNameMapping;
7470
};
7571

7672
}

libyul/backends/wasm/EVMToEwasmTranslator.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ Object EVMToEwasmTranslator::run(Object const& _object)
9393
Object ret;
9494
ret.name = _object.name;
9595
ret.code = make_shared<Block>(move(ast));
96+
ret.debugData = _object.debugData;
9697
ret.analysisInfo = make_shared<AsmAnalysisInfo>();
9798

9899
ErrorList errors;

test/cmdlineTests/constant_optimizer_yul/output

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ object "C_12" {
2121
return(128, _1)
2222
}
2323
}
24+
/// @use-src 0:"constant_optimizer_yul/input.sol", 1:"#utility.yul"
2425
object "C_12_deployed" {
2526
code {
2627
{

test/cmdlineTests/exp_base_literal/output

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ object "C_81" {
3838
}
3939

4040
}
41+
/// @use-src 0:"exp_base_literal/input.sol", 1:"#utility.yul"
4142
object "C_81_deployed" {
4243
code {
4344
/// @src 0:82:370

test/cmdlineTests/ir_compiler_inheritance_nosubobjects/output

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ object "C_7" {
1818
return(128, _1)
1919
}
2020
}
21+
/// @use-src 0:"ir_compiler_inheritance_nosubobjects/input.sol", 1:"#utility.yul"
2122
object "C_7_deployed" {
2223
code {
2324
{
@@ -50,6 +51,7 @@ object "D_10" {
5051
return(128, _1)
5152
}
5253
}
54+
/// @use-src 0:"ir_compiler_inheritance_nosubobjects/input.sol", 1:"#utility.yul"
5355
object "D_10_deployed" {
5456
code {
5557
{

test/cmdlineTests/ir_compiler_subobjects/output

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ object "C_3" {
1818
return(128, _1)
1919
}
2020
}
21+
/// @use-src 0:"ir_compiler_subobjects/input.sol", 1:"#utility.yul"
2122
object "C_3_deployed" {
2223
code {
2324
{
@@ -50,6 +51,7 @@ object "D_16" {
5051
return(128, _1)
5152
}
5253
}
54+
/// @use-src 0:"ir_compiler_subobjects/input.sol", 1:"#utility.yul"
5355
object "D_16_deployed" {
5456
code {
5557
{
@@ -88,6 +90,7 @@ object "D_16" {
8890
revert(0, 0)
8991
}
9092
}
93+
/// @use-src 0:"ir_compiler_subobjects/input.sol", 1:"#utility.yul"
9194
object "C_3" {
9295
code {
9396
{
@@ -99,6 +102,7 @@ object "D_16" {
99102
return(128, _1)
100103
}
101104
}
105+
/// @use-src 0:"ir_compiler_subobjects/input.sol", 1:"#utility.yul"
102106
object "C_3_deployed" {
103107
code {
104108
{

0 commit comments

Comments
 (0)