forked from OSchip/llvm-project
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:
parent
801fa8e6b9
commit
e21fc8770c
|
@ -0,0 +1,3 @@
|
|||
LEVEL = ../../../make
|
||||
C_SOURCES := main.c
|
||||
include $(LEVEL)/Makefile.rules
|
|
@ -0,0 +1,3 @@
|
|||
from lldbsuite.test import lldbinline
|
||||
|
||||
lldbinline.MakeInlineTest(__file__, globals())
|
|
@ -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'])
|
||||
}
|
|
@ -0,0 +1,3 @@
|
|||
LEVEL = ../../../make
|
||||
CXX_SOURCES := main.cpp
|
||||
include $(LEVEL)/Makefile.rules
|
|
@ -0,0 +1,3 @@
|
|||
from lldbsuite.test import lldbinline
|
||||
|
||||
lldbinline.MakeInlineTest(__file__, globals())
|
|
@ -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;
|
||||
}
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue