Add offsetof support to expression evaluator.

Summary:
We currently don't support offsetof in the expression evaluator as it is implemented as a macro
(which then calls __builtin_offsetof) in stddef.h. The best solution would be to include that
header (or even better, import Clang's builtin module), but header-parsing and
(cross-platform) importing modules is not ready yet.

Until we get this working with modules I would say we add the macro to our existing macro list
as we already do with other macros from stddef.h/stdint.h. We should be able to drop all of them
once we can import the relevant modules by default.

rdar://26040641

Reviewers: shafik, davide

Reviewed By: davide

Subscribers: clayborg, lldb-commits

Tags: #lldb

Differential Revision: https://reviews.llvm.org/D64917

llvm-svn: 366476
This commit is contained in:
Raphael Isemann 2019-07-18 17:58:04 +00:00
parent 801fa8e6b9
commit e21fc8770c
7 changed files with 52 additions and 0 deletions

View File

@ -0,0 +1,3 @@
LEVEL = ../../../make
C_SOURCES := main.c
include $(LEVEL)/Makefile.rules

View File

@ -0,0 +1,3 @@
from lldbsuite.test import lldbinline
lldbinline.MakeInlineTest(__file__, globals())

View File

@ -0,0 +1,12 @@
#include <stdint.h>
struct Foo {
int8_t a;
int16_t b;
};
int main (int argc, char const *argv[]) {
struct Foo f;
return f.a; //% self.expect("expr offsetof(Foo, a)", substrs = ['= 0'])
//% self.expect("expr offsetof(Foo, b)", substrs = ['= 2'])
}

View File

@ -0,0 +1,3 @@
LEVEL = ../../../make
CXX_SOURCES := main.cpp
include $(LEVEL)/Makefile.rules

View File

@ -0,0 +1,3 @@
from lldbsuite.test import lldbinline
lldbinline.MakeInlineTest(__file__, globals())

View File

@ -0,0 +1,25 @@
#include <cstdint>
class Base {
int32_t a;
};
class Class1 : Base {
public:
int32_t b;
};
class EmptyBase {
};
class Class2 : EmptyBase {
public:
int32_t b;
};
int main(int argc, char **argv) {
Class1 c1;
Class2 c2;
//% self.expect("expr offsetof(Base, a)", substrs=["= 0"])
//% self.expect("expr offsetof(Class1, b)", substrs=["= 4"])
//% self.expect("expr offsetof(Class2, b)", substrs=["= 0"])
return c1.b + c2.b;
}

View File

@ -30,6 +30,9 @@
using namespace lldb_private;
const char *ClangExpressionSourceCode::g_expression_prefix = R"(
#ifndef offsetof
#define offsetof(t, d) __builtin_offsetof(t, d)
#endif
#ifndef NULL
#define NULL (__null)
#endif